استخدام أمثلة المرجع
يمكن غالبًا ما يتم تحسين جودة الاستخراجات من خلال توفير أمثلة المرجع لنموذج اللغة الطويل الذاكرة.
نصيحة: بينما يركز هذا البرنامج التعليمي على كيفية استخدام الأمثلة مع أداة نموذج الاتصال، فإن هذه التقنية قابلة للتطبيق عمومًا، وستعمل أيضًا مع JSON وتقنيات البدء الفوري الأخرى.
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"أنت خبير في خوارزمية الاستخراج. فقط قم باستخلاص المعلومات ذات الصلة من النص. إذا لم تكن تعرف قيمة السمة المطلوب استخراجها، فعد بقيمة فارغة لقيمة السمة.",
),
MessagesPlaceholder("أمثلة"), # <-- الأمثلة!
("human", "{النص}"),
]
)
جرب القالب:
from langchain_core.messages import (
HumanMessage,
)
prompt.invoke(
{"النص": "هذا نص ما", "أمثلة": [HumanMessage(content="اختبار 1 2 3")]}
)
ChatPromptValue(messages=[SystemMessage(content="أنت خبير في خوارزمية الاستخراج. فقط قم باستخلاص المعلومات ذات الصلة من النص. إذا لم تكن تعرف قيمة السمة المطلوب استخراجها، فعد بقيمة فارغة لقيمة السمة."), HumanMessage(content='اختبار 1 2 3'), HumanMessage(content='هذا نص ما')])
تحديد المخطط
دعنا نعيد استخدام مخطط الشخص من البداية السريعة.
from typing import List, Optional
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
class Person(BaseModel):
"""معلومات حول شخص."""
name: Optional[str] = Field(..., description="اسم الشخص")
hair_color: Optional[str] = Field(
..., description="لون عيون الشخص إذا كان معروفًا"
)
height_in_meters: Optional[str] = Field(..., description="الارتفاع بالأمتار")
class Data(BaseModel):
"""بيانات مستخرجة حول الأشخاص."""
people: List[Person]
تحديد أمثلة الإشارة
يمكن تعريف الأمثلة على أنها قائمة من أزواج الإدخال والإخراج.
يحتوي كل مثال على نص الإدخال والناتج المتوقع الموضح ما يجب استخراجه من النص.
info
هذا يتعمق قليلاً، فلا تتردد في تجاهله إذا لم تفهمه!
تحتاج صيغة المثال إلى أن تتطابق مع الواجهة البرمجية المستخدمة (على سبيل المثال، استدعاء الأداة أو وضع JSON وما إلى ذلك).
هنا، ستتطابق الأمثلة المُنسَقة مع الشكل المتوقع لواجهة البرمجة التطبيقية لأن هذا ما نستخدمه.
import uuid
from typing import Dict, List, TypedDict
from langchain_core.messages import (
AIMessage,
BaseMessage,
HumanMessage,
SystemMessage,
ToolMessage,
)
from langchain_core.pydantic_v1 import BaseModel, Field
class Example(TypedDict):
"""تمثل مثالًا يتكون من نص الإدخال والمكالمات الأدوات المتوقعة.
بالنسبة للاستخراج، تتمثل مكالمات الأدوات في مثيلات من النموذج pydantic.
"""
input: str # هذا نص المثال
tool_calls: List[BaseModel] # مثيلات من النموذج pydantic التي يجب استخراجها
def tool_example_to_messages(example: Example) -> List[BaseMessage]:
"""تحويل المثال إلى قائمة من الرسائل التي يمكن تغذيتها إلى LLM.
يعد هذا الكود محولًا يحول مثالنا إلى قائمة من الرسائل
التي يمكن تغذيتها إلى نموذج دردشة.
تتوافق قائمة الرسائل لكل مثال مع:
1) HumanMessage: يحتوي على المحتوى الذي يجب استخراجه.
2) AIMessage: يحتوي على المعلومات المستخرجة من النموذج
3) ToolMessage: يحتوي على تأكيد للنموذج أن النموذج طلب أداة بشكل صحيح.
يُطلب ToolMessage لأن بعض نماذج الدردشة مُحسَنة بشكل كبير للوكلاء
بدلاً من حالة الاستخراج.
"""
messages: List[BaseMessage] = [HumanMessage(content=example["input"])]
openai_tool_calls = []
for tool_call in example["tool_calls"]:
openai_tool_calls.append(
{
"id": str(uuid.uuid4()),
"type": "function",
"function": {
"name": tool_call.__class__.__name__,
"arguments": tool_call.json(),
},
}
)
messages.append(
AIMessage(content="", additional_kwargs={"tool_calls": openai_tool_calls})
)
tool_outputs = example.get("tool_outputs") or [
"لقد قمت بالاتصال بالأداة بشكل صحيح."
] * len(openai_tool_calls)
for output, tool_call in zip(tool_outputs, openai_tool_calls):
messages.append(ToolMessage(content=output, tool_call_id=tool_call["id"]))
return messages
الآن دعنا نحدد أمثلتنا ومن ثم نحولها إلى شكل الرسالة.
examples = [
(
"المحيط واسع وأزرق. إنه أكثر من 20,000 قدم عميق. هناك الكثير من الأسماك فيه.",
Person(name=None, height_in_meters=None, hair_color=None),
),
(
"سافرت فيونا بعيدًا من فرنسا إلى إسبانيا.",
Person(name="Fiona", height_in_meters=None, hair_color=None),
),
]
messages = []
for text, tool_call in examples:
messages.extend(
tool_example_to_messages({"input": text, "tool_calls": [tool_call]})
)
دعنا نختبر النص
prompt.invoke({"text": "هذا نص ما", "examples": messages})
قيمة استدعاء المحادثة (رسائل) = [SystemMessage(content="أنت خبير خوارزمية الاستخراج. قم بإستخراج المعلومات ذات الصلة فقط من النص. إذا كنت لا تعرف قيمة السمة المطلوبة للاستخراج، فارجع قيمة فارغة (null) لقيمة السمة."),
HumanMessage(content="المحيط واسع وأزرق. عمقه يزيد على 20,000 قدم. هناك العديد من الأسماك فيه."),
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'c75e57cc-8212-4959-81e9-9477b0b79126', 'type': 'function', 'function': {'name': 'Person', 'arguments': '{"name": null, "hair_color": null, "height_in_meters": null}'}}]}),
ToolMessage(content='لقد قمت بالاستدعاء الصحيح لهذه الأداة.', tool_call_id='c75e57cc-8212-4959-81e9-9477b0b79126'),
HumanMessage(content='سافرت فيونا بعيدًا من فرنسا إلى إسبانيا.'),
AIMessage(content='', additional_kwargs={'tool_calls': [{'id': '69da50b5-e427-44be-b396-1e56d821c6b0', 'type': 'function', 'function': {'name': 'Person', 'arguments': '{"name": "Fiona", "hair_color": null, "height_in_meters": null}'}}]}),
ToolMessage(content='لقد قمت بالاستدعاء الصحيح لهذه الأداة.', tool_call_id='69da50b5-e427-44be-b396-1e56d821c6b0'),
HumanMessage(content='هذا نص ما')])
إنشاء استخراج
هنا، سنقوم بإنشاء استخراج باستخدام gpt-4.
llm = ChatOpenAI(
model="gpt-4-0125-preview",
temperature=0,
)
runnable = prompt | llm.with_structured_output(
schema=Data,
method="function_calling",
include_raw=False,
)
/Users/harrisonchase/workplace/langchain/libs/core/langchain_core/_api/beta_decorator.py:86: LangChainBetaWarning: الوظيفة `with_structured_output` قيد التطوير. يتم العمل عليها بنشاط، لذا قد تتغير واجهة التطبيق البرمجي.
warn_beta(
بدون أمثلة
لاحظ أنه على الرغم من استخدام gpt-4، إلا أنه يفشل مع حالة اختبار بسيطة جدًا!
for _ in range(5):
text = "النظام الشمسي كبير، لكن الأرض تحتوي فقط على قمر واحد."
print(runnable.invoke({"text": text, "examples": []}))
people=[]
people=[Person(name='earth', hair_color=None, height_in_meters=None)]
people=[Person(name='earth', hair_color=None, height_in_meters=None)]
people=[]
people=[]
مع الأمثلة
تساعد الأمثلة المرجعية في إصلاح الفشل!
for _ in range(5):
text = "النظام الشمسي كبير، لكن الأرض تحتوي فقط على قمر واحد."
print(runnable.invoke({"text": text, "examples": messages}))
people=[]
people=[]
people=[]
people=[]
people=[]
runnable.invoke(
{
"text": "اسمي هاريسون. لون شعري أسود.",
"examples": messages,
}
)
Data(people=[Person(name='Harrison', hair_color='black', height_in_meters=None)])