محلل الإخراج
يخرج نموذج اللغة LLM المحتوى بتنسيق نصي، ولكن عند تطوير تطبيقات الذكاء الاصطناعي، نود تلقي المحتوى المنسق، مثل تحويل النتائج إلى كائنات مستهدفة، ومصفوفات، وما إلى ذلك، لتسهيل معالجة البرنامج. وهذا يتطلب محلل الإخراج المقدم من LangChain لتنسيق المحتوى المُعاد بواسطة النموذج.
وظيفة محلل الإخراج هي تنسيق النتائج المرجعة من نموذج اللغة. يجب على محلل الإخراج تنفيذ طريقتين ضروريتين:
- "get_format_instructions": تُعيد سلسلة تحتوي على تعليمات لتنسيق يجب على نموذج اللغة الرد بها.
- "parse": يحلل المحتوى المُعاد بواسطة النموذج إلى التنسيق المستهدف.
الآن دعنا نلقي نظرة على محللات الإخراج المضمنة في LangChain.
محلل Pydantic
أدناه هو محلل الإخراج الأساسي PydanticOutputParser
المغلّف بواسطة LangChain. يعتمد هذا المحلل على مكتبة Python pydantic ويُستخدم لتحويل نتائج الإخراج من النموذج إلى أشياء Python.
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="سؤال لإعداد مزحة")
punchline: str = Field(description="الإجابة لإنهاء المزحة")
@validator("setup")
def question_ends_with_question_mark(cls, field):
if field[-1] != "?":
raise ValueError("سؤال مكوّن بشكل سيء!")
return field
parser = PydanticOutputParser(pydantic_object=Joke)
prompt = PromptTemplate(
template="الرد على استعلام المستخدم.\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": "أخبرني بمزحة."})
parser.invoke(output)
نتيجة المعاينة:
Joke(setup='لماذا عبر الدجاج الطريق؟', punchline='للوصول إلى الجهة الأخرى!')
واجهة LCEL
واجهة Runnable
ينفذ محلل الإخراج واجهة Runnable، وهي إحدى الوحدات الأساسية في لغة تعبير سلسلة اللغة (LCEL). إنها تدعم طرق الاستدعاء مثل invoke
، ainvoke
، stream
، astream
، batch
، abatch
، astream_log
، وما إلى ذلك.
تطبيق محللات الإخراج في LCEL
يمكن لمحلل الإخراج أن يقبل سلسلة أو BaseMessage
كإدخال ويُعيد بيانات منظمة من أي نوع. يمكننا بناء واستدعاء سلسلة محلل بإضافة المحلل إلى سلسلة Runnable.
chain = prompt | model | parser
chain.invoke({"query": "أخبرني بمزحة."})
تُعيد
Joke(setup='لماذا عبر الدجاج الطريق؟', punchline='للوصول إلى الجهة الأخرى!')
يمكن لبعض المحللين تدفق كائنات تحليل جزئية، مثل SimpleJsonOutputParser
، في حين لا يُدعم البعض الآخر التدفق. تعتمد النتيجة النهائية على ما إذا كان المحلل يمكنه بناء كائنات تحليل جزئية.
from langchain.output_parsers.json import SimpleJsonOutputParser
json_prompt = PromptTemplate.from_template(
"إرجاع كائن JSON بمفتاح `answer` يجيب على السؤال التالي: {question}"
)
json_parser = SimpleJsonOutputParser()
json_chain = json_prompt | model | json_parser
list(json_chain.stream({"question": "من اخترع الميكروسكوب؟"}))
[{},
{'answer': ''},
{'answer': 'نملة'},
{'answer': 'أنتون'},
{'answer': 'أنتوني'},
{'answer': 'أنتوني فان'},
{'answer': 'أنتوني فان لي'},
{'answer': 'أنتوني فان ليو'},
{'answer': 'أنتوني فان ليون'},
{'answer': 'أنتوني فان ليونه'},
{'answer': 'أنتوني فان ليونهوك'}]
في LCEL، يمكننا بناء تدفقات معالجة بيانات معقدة عن طريق دمج مختلف المحللين لتلبية متطلبات متنوعة.