1. ریٹریورز

ریٹریور ایک انٹرفیس ہے جو لینگ چین کی طرف سے کنوں کی گئی ہے، جو غیر تنظیم شدہ سوالات کے بنیاد پر متعلقہ دستاویزات واپس کر سکتا ہے۔ ریٹریور ڈیزائن کا مقصد مقامی ڈیٹا کی سوالیہ پیشکش کرنے میں مدد فراہم کرنا ہے۔ ویکٹر اسٹوریج ریٹریور کے کم از کم نیچے کے ایمپلیمنٹیشن کے طور پر استعمال کیا جا سکتا ہے، اور لینگ چین ریٹریور کی مختلف ایمپلیمنٹیشن کا ایجاد فراہم کرتا ہے۔

2. ریٹریور کے ساتھ شروع کرنا

2.1. سٹالیشن

ریٹریور حاصل کرنے کا طریقہ دکھانے کے لئے، ہم قدرنٹ ویکٹر ڈیٹا بیس کا مثال بنائیں گے۔

%pip install --upgrade --quiet qdrant-client

2.2. اوپن اے آئی پی کلید حاصل کرنا

OpenAIEmbeddings استعمال کرنے سے پہلے، ہمیں اوپن اے آئی پی کلید حاصل کرنا ہوگا۔

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

2.3. دستاویزات کا چارج اور قدرنٹ کلائنٹ حاصل کرنا

نیچے دی گئی کوڈ دکھاتا ہے کہ دستاویزات کا چارج کیسے کیا جاتا ہے اور قدرنٹ کلائنٹ حاصل کیا جاتا ہے تاکہ ایک ریٹریور بنایا جا سکے۔

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. ریٹریور حاصل کرنا

نیچے دی گئی کوڈ دکھاتا ہے کہ قدرنٹ سے ریٹریور کیسے حاصل کیا جاتا ہے۔

retriever = qdrant.as_retriever()
retriever

آپ ایسے سوالات کا دستاویزات کا جواب حاصل کرسکتے ہیں:

docs = retriever.get_relevant_documents("کیا اس نے کیا کہا کہ ketanji براؤن jackson کے بارے میں")

آپ یہ بھی کر سکتے ہیں کہ ریٹریور کے لئے مشابہت کا حد تعین کریں۔

retriever = db.as_retriever(
    search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.5}
)

اس کے علاوہ، آپ ریٹریور کو ٹاپ 'K' مشابہ ریکارڈز واپس کرنے کے لئے بھی تعین کرسکتے ہیں، مثال کے طور پر، اوپر 2 مشابہ ریکارڈز واپس کرنے کے لئے:

retriever = db.as_retriever(search_kwargs={"k": 2})

2.5. ریٹریور کا LCEL میں استعمال کرنا

ریٹریورز Runnable آبجیکٹس ہوتے ہیں، اور ہم انہیں آسانی سے دوسرے Runnable آبجیکٹس کے ساتھ ملا کر ورک فلو کو آرڈر کر سکتے ہیں۔

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 = """صرف مندرجہ ذیل سیاق و سباق پر بنیاد رکھ کر سوالات کا جواب دیں:

{context}

سوال: {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("صحیح صاحب کے بارے میں ٹیکنالوجی کے بارے میں کیا کہا؟")

عمل کی وضاحت:

  • قدم 1: ہدف ہے کہ ایک ڈکشنری جنم دینا جو دو اصول، موقع اور سوال، کو prompt template کے لئے تیار کرنے کے لئے معاملوں کو پراکشن کرتا ہے۔ موقع پارامیٹر invoke میں موجود پیرامیٹر (صارف کا سوال) کے مطابق ہوتا ہے، جو "صحیح صاحب کے بارے میں ٹیکنالوجی کے بارے میں کیا کہا؟" ہے۔ یہ سوال کے مشابہ دستاویزات حاصل کرتا ہے، پھر format_docs فنکشن کا استعمال کر کے دستاویزات کی مصفوفہ کو ترتیب دیتا ہے اور اسے موقع پر قرار دیتا ہے۔ RunnablePassthrough فنکشن زنجیر کے پیرامیٹر (صارف کا سوال) کا نقل کرتا ہے،
  • قدم 2: پہلا قدم پر تیار کیا گیا ڈکشنری پرومپٹ تمپلیٹ کو فارمٹ کرنے کے لئے پاس ہوتا ہے۔
  • قدم 3: پرومپٹ تمپلیٹ سے فارمٹ کردہ پرومپٹ کو ماڈل کو پاس کیا جاتا ہے۔
  • قدم 4: ماڈل کے کال کے نتیجے کو خروجی پارسر StrOutputParser کو پاس کرنا۔

3. اپنا ریٹریور

4.1. ریٹریور انٹرفیس کی تعارف

ریٹریور انٹرفیس بہت سادہ ہوتا ہے، اور ہم آسانی سے اپنے ریٹریورز لکھ سکتے ہیں۔

4.2. مخصوص پانے والا مثال

یہاں ایک مخصوص پانے والے کا مثال ہے، جو دکھاتا ہے کہ آپ کس طرح اپنا مخصوص پانے والا تیار کریں اور اسے استعمال کر کے متعلقہ دستاویزات کو حاصل کریں:

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")

اوپر دی گئی حصوں کی مطالعے سے، آپ کو تصور کرنے کی قوت، پانے حاصل کرنے کے طریقے، اور پانے والے کی تخصیص کا ایک عمیق فہم حاصل ہوگا۔