آپٹپٹ پارسر

LLM زبان ماڈل ٹیکسٹ فارمیٹ میں مواد خارج کرتا ہے، لیکن AI ایپلیکیشنز کو تیار کرتے وقت، ہمیں فارمیٹ مواد، جیسے نتائج کو نشانے کے اشیاء، ایرے وغیرہ میں تبدیل کرنا چاہتے ہیں، تاکہ پروگرام پروسیسنگ کو ممکن ہو۔ اس کے لئے LangChain کی طرف سے فراہم کیا گیا آپٹپٹ پارسر کونٹینٹ کو فارمیٹ کرنے کی ضرورت ہوتی ہے۔

آؤ پہلے دیکھیں کہ LangChain میں موجود بنیادی آپٹپٹ پارسر کیسے ہیں۔

پائیڈانٹ پارسر

نیچے دی گئی ہے LangChain کی طرف سے انکیپسولیٹ کی گئی مرکزی آپٹپٹ پارسر PydanticOutputParser۔ یہ پارسر پائیتھن کی پائیڈانٹ لائبریری پر مبنی ہے اور ماڈل کے ایؤٹپٹ نتائج کو پائیتھن آبجیکٹس میں تبدیل کرنے کے لئے استعمال ہوتا ہے۔

from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import PromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field, validator
from langchain_openai import OpenAI

model = OpenAI(model_name="gpt-3.5-turbo-instruct", temperature=0.0)

class Joke(BaseModel):
    setup: str = Field(description="question to set up a joke")
    punchline: str = Field(description="answer to resolve the joke")

    @validator("setup")
    def question_ends_with_question_mark(cls, field):
        if field[-1] != "?":
            raise ValueError("Badly formed question!")
        return field

parser = PydanticOutputParser(pydantic_object=Joke)

prompt = PromptTemplate(
    template="Answer the user query.\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)

prompt_and_model = prompt | model
output = prompt_and_model.invoke({"query": "Tell me a joke."})
parser.invoke(output)

نمونہ واپسی کا نتیجہ:

Joke(setup='Why did the chicken cross the road?', punchline='To get to the other side!')

LCEL انٹرفیس

قابل رننگ انٹرفیس

آپٹپٹ پارسر Runnable انٹرفیس کو پیش کرتا ہے، جو لینگچین ایکسپریشن لینگویج (LCEL) کی بنیادی عمارتوں میں سے ایک ہے۔ یہ invoke، ainvoke، stream، astream، batch، abatch، astream_log وغیرہ جیسی بلانسر کے طریقوں کو سپورٹ کرتا ہے۔

LCEL میں آپٹپٹ پارسر کا اطلاق

آپٹپٹ پارسر ایک اسٹرنگ یا BaseMessage کو داخلی مانند قبول کر سکتا ہے اور کسی بھی قسم کا سکچا بنا سکتا ہے۔ ہم کسی بھی آپتپٹ پارسر کو ایک رننگ سیکوئنس میں پارسر شامل کر کے ایک پارسر چین بنا سکتے ہیں۔

chain = prompt | model | parser
chain.invoke({"query": "Tell me a joke."})

واپسی

Joke(setup='Why did the chicken cross the road?', punchline='To get to the other side!')

کچھ پارسر قسم کی نصف پارسنگ آبجیکٹس کو سٹریم کر سکتے ہیں، جیسے SimpleJsonOutputParser، جبکہ دوسرے اس کی حمایت نہیں کرتے۔ آخری آؤٹپٹ پر پارسر کی مکمل پارسنگ آبجیکٹس جو اس پرسر نے بنا سکا ہو، پر منحصر ہوتا ہے۔

from langchain.output_parsers.json import SimpleJsonOutputParser

json_prompt = PromptTemplate.from_template(
    "Return a JSON object with an `answer` key that answers the following question: {question}"
)
json_parser = SimpleJsonOutputParser()
json_chain = json_prompt | model | json_parser
list(json_chain.stream({"question": "Who invented the microscope?"}))
[{},
 {'answer': ''},
 {'answer': 'Ant'},
 {'answer': 'Anton'},
 {'answer': 'Antonie'},
 {'answer': 'Antonie van'},
 {'answer': 'Antonie van Lee'},
 {'answer': 'Antonie van Leeu'},
 {'answer': 'Antonie van Leeuwen'},
 {'answer': 'Antonie van Leeuwenho'},
 {'answer': 'Antonie van Leeuwenhoek'}]

LCEL میں ہم مختلف پارسرز کو ملا کر مختلف ضروریات پوری کرنے کے لئے معقولات کے پیش نظر عملی پروسیسنگ فلوز بنا سکتے ہیں۔