विश्लेषण

LLMs जो अच्छी तरह से निर्देशिका निर्देशों का पालन कर सकते हैं, उन्हें निर्दिष्ट प्रारूप में जानकारी उत्पन्न करने के लिए कार्यों का सौंपा जा सकता है।

इस दृष्टिकोण पर भरोसा करता है कि अच्छी निर्देशिका तैयार करने के बाद LLMs के उत्पाद को विशेष रूप से विश्लेषित करने के लिए डिजाइन किया जाएगा।

यहां, हम क्लॉड का उपयोग करेंगे जो निर्देशों का अच्छी तरह से पालन करने में महान है! पूर्वाधार मॉडल देखें।

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 = "अना 23 वर्ष की हैं और वह 6 फीट लंबी हैं"
print(prompt.format_prompt(query=query).to_string())
System: उपयोगकर्ता के प्रश्न का उत्तर दें। उत्पाद को `json` टैग में पैक करें
उत्पाद को वह जेसन स्कीमा के हिसाब से एक JSON उदाहरण के रूप में सूचीत करना चाहिए।

मिसाल के रूप में, जेसन स्कीमा के लिए {"properties": {"foo": {"title": "Foo", "description": "a list of strings", "type": "array", "items": {"type": "string"}}}, "required": ["foo"]} के लिए ऑब्जेक्ट {"foo": ["bar", "baz"]} स्कीमा का एक अच्छी रूप से तैयार उदाहरण है। ऑब्जेक्ट {"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": "नाम", "description": "व्यक्ति का नाम", "type": "string"}, "height_in_meters": {"title": "मीटर में ऊँचाई", "description": "व्यक्ति की ऊँचाई मीटर में व्यक्त करती है।", "type": "number"}}, "required": ["name", "height_in_meters"]}}}

Human: अना 23 वर्ष की हैं और वह 6 फीट लंबी हैं
chain = prompt | model | parser
chain.invoke({"query": query})
People(people=[Person(name='अना', 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\n{schema}\n```. "
            "यह सुनिश्चित करें कि आप उत्तर को ```json और ``` टैग में बांधते हैं",
        ),
        ("human", "{query}"),
    ]
).partial(schema=People.schema())


def extract_json(message: AIMessage) -> List[dict]:
    """JSON सामग्री को एक स्ट्रिंग से निकालता है, जहां JSON ```json और ``` टैग के बीच एम्बेड है।

    Parameters:
        text (str): JSON सामग्री वाला पाठ।

    Returns:
        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"An error occurred while parsing: {message}")
query = "अन्ना 23 साल की है और वह 6 फीट लंबी है।"
print(prompt.format_prompt(query=query).to_string())
System: उपयोक्ता के प्रश्न का उत्तर दें। आपका उत्तर दिए गए स्कीमा से मेल खाता होना चाहिए: \`\`\`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: अन्ना 23 साल की है और वह 6 फीट लंबी है।
chain = prompt | model | extract_json
chain.invoke({"query": query})
[{'people': [{'name': 'अन्ना', 'height_in_meters': 1.83}]}]

अन्य लाइब्रेरी

अगर आप पार्सिंग द्वारा निकालने पर ध्यान दे रहे हैं, तो Kor लाइब्रेरी की जांच करें। यह LangChain में संदार्भिकों में से एक द्वारा लिखा गया है और यह माद्दा (schema) को TypeScript में व्यक्त करने की अनुमति देता है, यहां तक कि फोर्मेट (जैसे, JSON या CSV) को नियंत्रित करने की भी अनुमति देता है। यह काफी अच्छा काम करता है!