تجزیہ کرنا

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

اس اپروچ پر یہ نکتہ نظر ہے کہ اچھے پرامپٹس ڈیزائن کرنے پر اور تاکیدی طور پر LLMs کے آؤٹپٹ کو تجزیہ کرنے پر مبنی ہے تاکہ وہ معلومات کو بہتر طریقے سے حاصل کر سکیں۔

یہاں ہم کلوڈ استعمال کریں گے جو ہدایات کو ماننے میں ماہر ہے! Anthropic models دیکھیں۔

from langchain_anthropic.chat_models import ChatAnthropic

model = ChatAnthropic(model_name="claude-3-sonnet-20240229", temperature=0)

نکتہ: تمام مواصل کی کیمیت کیلئے یکساں غور کرنے پر، تجزیہ کے اندراج کی معیاریت کیے جانے کی تمام سوچ بسیرء کرتی ہے۔ کام کی معیاریت کی مخالفت کی رہنمائیوں کا جائزہ لیں۔

یہ ٹیوٹوریل سادہ ہونے کا مقصود ہے، لیکن عام طور پر عمل کرنے والے مثالیں ضم کرنے کی حیثیت سے واقعی کامیابی حاصل کرنے کے لئے شمولیت کی بھرمار ہونے چاہئے۔

PydanticOutputParser کا استعمال

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

from typing import List, Optional

from langchain.output_parsers import PydanticOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field, validator


class Person(BaseModel):
    """کسی شخص کی معلومات۔"""

    name: str = Field(..., description="شخص کا نام")
    height_in_meters: float = Field(
        ..., description="شخص کی لمبائی میٹر میں بیان کی گئی ہے۔"
    )


class People(BaseModel):
    """ایک متن میں تمام افراد کی شناختی معلومات۔"""

    people: List[Person]


parser = PydanticOutputParser(pydantic_object=People)

prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "صارف کی سوال کا جواب دیں۔ آؤٹپٹ کو `json` ٹیگز میں چھپائیں\n{format_instructions}",
        ),
        ("human", "{query}"),
    ]
).partial(format_instructions=parser.get_format_instructions())

چلیں دیکھ لیں کہ کسی شخص کی معلومات کیا ٹوچ کر کے ڈالا گیا ہے

query = "Anna is 23 years old and she is 6 feet tall"
print(prompt.format_prompt(query=query).to_string())
System: صارف کی سوال کا جواب دیں۔ آؤٹپٹ کو `json` ٹیگز میں چھپائیں
آؤٹپٹ کو یوں چھپایا جائے کہ یہ جیسے جیسے ہونا چائے۔

مثال کے طور پر، {"properties": {"foo": {"title": "Foo", "description": "a list of strings", "type": "array", "items": {"type": "string"}}}, "required": ["foo"]}
یہ سکیما کے لئے موزوں انسٹنس ہے۔ یہ سکیما کے لئے انسٹنس نہیں ہے {"properties": {"foo": ["bar", "baz"]}} ۔

یہاں آؤٹپٹ سکیما ہے:
{"description": "متن میں تمام افراد کی پہچان کے بارے میں معلومات۔", "properties": {"people": {"title": "People", "type": "array", "items": {"$ref": "#/definitions/Person"}}}, "required": ["people"], "definitions": {"Person": {"title": "Person", "description": "کسی شخص کی معلومات۔", "type": "object", "properties": {"name": {"title": "Name", "description": "شخص کا نام", "type": "string"}, "height_in_meters": {"title": "Height In Meters", "description": "شخص کی لمبائی میٹر میں بیان کی گئی ہے۔", "type": "number"}}, "required": ["name", "height_in_meters"]}}}

Human: Anna is 23 years old and she is 6 feet tall
chain = prompt | model | parser
chain.invoke({"query": query})
People(people=[Person(name='Anna', height_in_meters=1.83)])

کسٹم پارسنگ

LangChain اور LCEL کے ساتھ ایک کسٹم پرومپٹ اور پارسر بنانا بہت آسان ہے۔

آپ ایک سادہ تفصیل سے آؤٹ پُٹ کو ماڈل سے پارس کرنے کے لئے ایک سادہ فنکشن استعمال کرسکتے ہیں۔

import json
import re
from typing import List, Optional

from langchain_anthropic.chat_models import ChatAnthropic
from langchain_core.messages import AIMessage
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field, validator


class Person(BaseModel):
    """ایک شخص کی معلومات۔"""

    name: str = Field(..., description="شخص کا نام")
    height_in_meters: float = Field(
        ..., description="شخص کی لمبائی میٹر میں۔"
    )


class People(BaseModel):
    """میسج میں تمام لوگوں کی پہچانیں بتانے والی معلومات۔"""

    people: List[Person]


prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "صارف کے سوال کا جواب دیں۔ اپنے جواب کو ایسا JSON بنائیں جو دی گئی سکیما کے مطابق ہو: ```json\n{schema}\n```. "
            "یہ یقینی بنائیں کہ جواب کو ```json اور ``` کے تاکوں میں بنائیں",
        ),
        ("human", "{query}"),
    ]
).partial(schema=People.schema())


def extract_json(message: AIMessage) -> List[dict]:
    """JSON مواد کو اُتارنا جہاں JSON کو ```json اور ``` ٹیگز کے درمیان کرکے درج کیا گیا ہو۔

    پیرامیٹر:
        text (str): JSON مواد شامل ہونے والا مواد۔

    ریٹرن:
        list: اُتارے گئے JSON مواد کی فہرست۔
    """
    text = message.content
    pattern = r"```json(.*?)```"

    matches = re.findall(pattern, text, re.DOTALL)

    try:
        return [json.loads(match.strip()) for match in matches]
    except Exception:
        raise ValueError(f"تشخیص کرنےمیں ناکام ہوگیا: {message}")
query = "Anna is 23 years old and she is 6 feet tall"
print(prompt.format_prompt(query=query).to_string())
System: صارف کے سوال کا جواب دیں۔ اپنے جواب کو ایسا JSON بنائیں جو دی گئی سکیما کے مطابق ہو: \`\`\`json
{'title': 'People', 'description': 'میسج میں تمام لوگوں کی پہچانیں بتانے والی معلومات۔', 'type': 'object', 'properties': {'people': {'title': 'People', 'type': 'array', 'items': {'$ref': '#/definitions/Person'}}}, 'required': ['people'], 'definitions': {'Person': {'title': 'Person', 'description': 'ایک شخص کی معلومات۔', 'type': 'object', 'properties': {'name': {'title': 'Name', 'description': 'شخص کا نام', 'type': 'string'}, 'height_in_meters': {'title': 'Height In Meters', 'description': 'شخص کی لمبائی میٹر میں۔', 'type': 'number'}}, 'required': ['name', 'height_in_meters']}}}
\`\`\`. یہ یقینی بنائیں کہ جواب کو \`\`\`json اور \`\`\` کے تاکوں میں بنائیں
Human: Anna is 23 years old and she is 6 feet tall
chain = prompt | model | extract_json
chain.invoke({"query": query})
[{'people': [{'name': 'Anna', 'height_in_meters': 1.83}]}]

دیگر کتابخانے

اگر آپ ایک پارسر بنانے کی کوشش کررہے ہیں تو Kor لائبریری کا مطالعہ کریں۔ یہ ایک LangChain مینٹینرز میں سے ایک نے لکھی ہے اور یہ مثالوں کو مد نظر رکھتی ہے، فارمیٹس (مثلاً JSON یا CSV) کو کنٹرول کرنے کی اجازت دیتی ہے اور سکیما کو ٹائپ اسکرپٹ میں بیان کرتی ہے۔ یہ کام کرنے میں بہترین لگتی ہے۔