Trình dịch kết quả
Ngôn ngữ mô hình LLM trả về nội dung dưới dạng văn bản, tuy nhiên khi phát triển ứng dụng AI, chúng ta muốn nhận được nội dung đã được định dạng, chẳng hạn như chuyển đổi kết quả thành các đối tượng mục tiêu, mảng, v.v., để tạo điều kiện cho xử lý chương trình. Điều này đòi hỏi trình dịch kết quả do LangChain cung cấp để định dạng nội dung mô hình trả về.
Chức năng của trình dịch kết quả là định dạng kết quả được trả về bởi mô hình ngôn ngữ. Một trình dịch kết quả phải triển khai hai phương thức cần thiết:
- "get_format_instructions": Trả về một chuỗi chứa hướng dẫn cho định dạng mà mô hình ngôn ngữ nên trả về.
- "parse": Phân tích nội dung trả về bởi mô hình thành định dạng mục tiêu.
Bây giờ chúng ta sẽ xem xét các trình dịch kết quả tích hợp sẵn trong LangChain.
Trình dịch Pydantic
Dưới đây là trình dịch kết quả lõi PydanticOutputParser
được đóng gói bởi LangChain. Trình dịch này dựa trên thư viện Python pydantic và được sử dụng để chuyển đổi kết quả đầu ra của mô hình thành các đối tượng 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="câu hỏi để chuẩn bị một câu đùa")
punchline: str = Field(description="câu trả lời để giải quyết câu đùa")
@validator("setup")
def question_ends_with_question_mark(cls, field):
if field[-1] != "?":
raise ValueError("Câu hỏi xây dựng không đúng!")
return field
parser = PydanticOutputParser(pydantic_object=Joke)
prompt = PromptTemplate(
template="Trả lời yêu cầu của người dùng.\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": "Kể cho tôi một câu đùa."})
parser.invoke(output)
Kết quả trả về mẫu:
Joke(setup='Tại sao con gà bắt đầu băng qua đường?', punchline='Để đến bên kia!')
Giao diện LCEL
Giao diện Chạy được
Trình dịch kết quả triển khai giao diện Chạy được, đó là một trong những khối xây dựng cơ bản của Ngôn ngữ Mô hình Chuỗi (LCEL). Nó hỗ trợ các phương thức gọi như invoke
, ainvoke
, stream
, astream
, batch
, abatch
, astream_log
, v.v.
Ứng dụng của Trình dịch Kết quả trong LCEL
Trình dịch kết quả có thể chấp nhận một chuỗi hoặc BaseMessage
dưới dạng đầu vào và trả về dữ liệu có cấu trúc của bất kỳ loại nào. Chúng ta có thể xây dựng và gọi một chuỗi trình dịch bằng cách thêm trình dịch vào một chuỗi Chạy được.
chain = prompt | model | parser
chain.invoke({"query": "Kể cho tôi một câu đùa."})
Trả về
Joke(setup='Tại sao con gà bắt đầu băng qua đường?', punchline='Để đến bên kia!')
Một số trình dịch có thể stream các đối tượng phân tích một phần, chẳng hạn như SimpleJsonOutputParser
, trong khi một số khác không hỗ trợ streaming. Kết quả cuối cùng phụ thuộc vào việc trình dịch có thể xây dựng các đối tượng phân tích một phần hay không.
from langchain.output_parsers.json import SimpleJsonOutputParser
json_prompt = PromptTemplate.from_template(
"Trả về một đối tượng JSON với `answer` key trả lời cho câu hỏi sau: {question}"
)
json_parser = SimpleJsonOutputParser()
json_chain = json_prompt | model | json_parser
list(json_chain.stream({"question": "Ai là người phát minh ra kính hiển vi?"}))
[{},
{'answer': ''},
{'answer': 'Kiến'},
{'answer': 'Anton'},
{'answer': 'Antonie'},
{'answer': 'Antonie van'},
{'answer': 'Antonie van Lee'},
{'answer': 'Antonie van Leeu'},
{'answer': 'Antonie van Leeuwen'},
{'answer': 'Antonie van Leeuwenho'},
{'answer': 'Antonie van Leeuwenhoek'}]
Trong LCEL, chúng ta có thể xây dựng các luồng xử lý dữ liệu phức tạp bằng cách kết hợp các trình dịch khác nhau để đáp ứng các yêu cầu khác nhau.