1. Alıcılar
Retriever, LangChain tarafından kapsüllenmiş bir arayüzdür ve yapılandırılmamış sorgulara dayalı ilgili belgeleri döndürebilir. Retriever tasarımının amacı yerel verilerin sorgulanmasını kolaylaştırmaktır. Alıcı arayüzünün altta yatan uygulaması olarak Vektör depolama kullanılabilir ve LangChain, alıcı arayüzünün birden fazla altta yatan uygulamasını destekler.
2. Alıcı ile Başlarken
2.1. Kurulum
Bir alıcıyı nasıl elde edeceğimizi göstermek için Qdrant vektör veritabanını kullanacağız.
%pip install --upgrade --quiet qdrant-client
2.2. OpenAI API Anahtarını Almak
OpenAIEmbeddings
'i kullanmadan önce OpenAI API anahtarını almamız gerekiyor.
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Anahtarı:")
2.3. Belge Verilerini İçe Aktarma ve Qdrant İstemcisini Almak
Aşağıdaki kod, belge verilerini içe aktarma ve alıcı oluşturmak için Qdrant istemcisini nasıl elde edeceğimizi gösterir:
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Qdrant
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
loader = TextLoader("../../modules/state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
qdrant = Qdrant.from_documents(
docs,
embeddings,
path="/tmp/local_qdrant",
collection_name="my_documents",
)
2.4. Alıcıyı Elde Etmek
Aşağıdaki kod, Qdrant'tan alıcıyı nasıl elde edeceğimizi gösterir:
retriever = qdrant.as_retriever()
retriever
Bir soru ile ilgili belgeleri sorgulayabilirsiniz:
docs = retriever.get_relevant_documents("ketanji brown jackson hakkında ne söyledi")
Ayrıca, alıcı için benzerlik eşiği de belirleyebilirsiniz:
retriever = db.as_retriever(
search_type="benzerlik_skoru_eşiği", search_kwargs={"score_threshold": 0.5}
)
Ayrıca, alıcıyı en üstteki 'K' en benzer kayıt döndürecek şekilde ayarlayabilirsiniz, örneğin en üstteki 2 en benzer kaydı döndürmek için:
retriever = db.as_retriever(search_kwargs={"k": 2})
2.5. LCEL'de Alıcı Kullanımı
Alıcılar Çalıştırılabilir
nesneler olduğu için, onları diğer Çalıştırılabilir
nesnelerle kolayca birleştirerek iş akışlarını düzenleyebiliriz:
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
template = """Sadece aşağıdaki bağlam temel alınarak soruları yanıtlayın:
{context}
Soru: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()
def format_docs(docs):
return "\n\n".join([d.page_content for d in docs])
chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| model
| StrOutputParser()
)
chain.invoke("Başkan teknoloji hakkında ne söyledi?")
İşlem açıklaması:
- Adım 1: Hedef, prompt şablonu için parametreleri hazırlamak olan,
context
vequestion
olmak üzere iki özelliği içeren bir sözlük oluşturmaktır.context
parametresi,invoke
yöntemine iletilen "Başkan teknoloji hakkında ne söyledi?" olan parametreye dayanarakretriever
alıcısı tarafından alındı. Bu, soruya benzer belgeleri alır, ardından belge dizisiniformat_docs
işlevi kullanarak biçimlendirir vecontext
özelliğine atar.RunnablePassthrough
işlevi, zincirin parametresini (kullanıcının girdiği soru)question
özelliğine kopyalar. - Adım 2: İlk adımda oluşturulan sözlüğü prompt şablonuna biçimlendirme için iletilir.
- Adım 3: Biçimlendirilmiş prompt'u model için iletilir.
- Adım 4: Model çağrısının sonucu
StrOutputParser
'a iletilir.
3. Özel Alıcı
4.1. Alıcı Arayüzüne Giriş
Alıcı arayüzü çok basittir ve kolayca özel alıcılar yazabiliriz.
4.2. Özel Alıcı Örneği
Aşağıda, özel bir alıcıyı nasıl yazacağınızı ve ilgili belgeleri almak için nasıl kullanacağınızı gösteren bir özel alıcı örneği bulunmaktadır:
from langchain_core.retrievers import BaseRetriever
from langchain_core.callbacks import CallbackManagerForRetrieverRun
from langchain_core.documents import Document
from typing import List
class CustomRetriever(BaseRetriever):
def _get_relevant_documents(
self, query: str, *, run_manager: CallbackManagerForRetrieverRun
) -> List[Document]:
return [Document(page_content=query]
retriever = CustomRetriever()
retriever.get_relevant_documents("bar")
Yukarıdaki bölümleri inceleyerek, kavramın, alıcı yöntemlerinin ve alıcıların özelleştirilmesinin daha derin bir anlayışına sahip olacaksınız.