تحليل
النماذج اللغوية الطويلة القصيرة التي تتمكن من اتباع التعليمات بشكل جيد يمكنها تنفيذ مهام استخراج المعلومات بتنسيق معين.
تعتمد هذه الطريقة على تصميم تعليمات جيدة ثم تحليل إخراج النماذج اللغوية الطويلة القصيرة لجعلها تستخرج المعلومات بشكل جيد.
هنا، سنستخدم كلود الذي يعتبر جيدًا في اتباع التعليمات! انظر نماذج Anthropic.
from langchain_anthropic.chat_models import ChatAnthropic
model = ChatAnthropic(model_name="claude-3-sonnet-20240229", temperature=0)
نصيحة: جميع الاعتبارات نفسها تنطبق على جودة استخراج المعلومات. قم بمراجعة الإرشادات لجودة الاستخراج.
يُقصد بهذا البرنامج التعليمي أن يكون بسيطًا، ولكن ينبغي عمومًا أن يشمل أمثلة مرجعية حقيقية لكفاءة أقصى!
استخدام مُحلل الإخراج Pydantic
المثال التالي يستخدم 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 يتوافق مع مخطط 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": "الناس", "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 تتطابق مع السكيما المعطاة: ```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 = "آنا عمرها 23 عاماً وطولها 6 أقدام"
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: آنا عمرها 23 عاماً وطولها 6 أقدام
chain = prompt | model | extract_json
chain.invoke({"query": query})
[{'people': [{'name': 'آنا', 'height_in_meters': 1.83}]}]
مكتبات أخرى
إذا كنت تبحث عن استخراج باستخدام نهج التحليل، تحقق من مكتبة Kor. وهي مكتوبة من قبل أحد الأشخاص الذين يعتنون بـ LangChain
وتساعد في صياغة موقف يأخذ الأمثلة في الاعتبار، وتسمح بالتحكم في التنسيقات (مثل JSON أو CSV) وتعبر عن السكيما في TypeScript. يبدو أنها تعمل بشكل جيد!