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 ve question 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 dayanarak retriever alıcısı tarafından alındı. Bu, soruya benzer belgeleri alır, ardından belge dizisini format_docs işlevi kullanarak biçimlendirir ve context ö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.