Sử dụng các ví dụ tham chiếu
Chất lượng của các trích xuất thường có thể được cải thiện bằng cách cung cấp các ví dụ tham chiếu cho LLM.
Mẹo: Mặc dù hướng dẫn này tập trung vào cách sử dụng ví dụ với mô hình gọi là công cụ, kỹ thuật này thường được áp dụng và cũng sẽ hoạt động với các kỹ thuật dựa trên JSON hoặc dựa trên prompt.
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"Bạn là một thuật toán trích xuất chuyên gia. "
"Chỉ trích xuất thông tin liên quan từ văn bản. "
"Nếu bạn không biết giá trị của một thuộc tính được yêu cầu trích xuất, hãy trả về null cho giá trị của thuộc tính đó.",
),
MessagesPlaceholder("examples"), # <-- VÍ DỤ!
("human", "{text}"),
]
)
Thử nghiệm mẫu:
from langchain_core.messages import (
HumanMessage,
)
prompt.invoke(
{"text": "đây là một số văn bản", "examples": [HumanMessage(content="kiểm tra 1 2 3")]}
)
ChatPromptValue(messages=[SystemMessage(content="Bạn là một thuật toán trích xuất chuyên gia. Chỉ trích xuất thông tin liên quan từ văn bản. Nếu bạn không biết giá trị của một thuộc tính được yêu cầu trích xuất, hãy trả về null cho giá trị của thuộc tính đó."), HumanMessage(content='kiểm tra 1 2 3'), HumanMessage(content='đây là một số văn bản')])
Xác định mẫu
Hãy sử dụng lại schema về người từ hướng dẫn nhanh.
from typing import List, Optional
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
class Person(BaseModel):
"""Thông tin về một người."""
name: Optional[str] = Field(..., description="Tên của người")
hair_color: Optional[str] = Field(
..., description="Màu của đôi mắt nếu biết được"
)
height_in_meters: Optional[str] = Field(..., description="Chiều cao tính bằng mét")
class Data(BaseModel):
"""Dữ liệu trích xuất về những người."""
people: List[Person]
Định nghĩa ví dụ tham chiếu
Các ví dụ có thể được định nghĩa dưới dạng các cặp đầu vào-đầu ra.
Mỗi ví dụ chứa một văn bản đầu vào và một đầu ra cho thấy nội dung cần phải được trích xuất từ văn bản.
Thông tin
Đây là một chút rườm rà, vì vậy thoải mái bỏ qua nếu bạn không hiểu!
Định dạng của ví dụ cần phải phù hợp với API được sử dụng (ví dụ: gọi công cụ hoặc chế độ JSON v.v.).
Ở đây, các ví dụ định dạng sẽ phù hợp với định dạng mong đợi cho API gọi công cụ vì đó là điều chúng tôi đang sử dụng.
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):
"""Một biểu diễn của một ví dụ bao gồm đầu vào văn bản và các cuộc gọi công cụ dự kiến.
Đối với việc trích xuất, các cuộc gọi công cụ được biểu diễn dưới dạng các trường hợp của mô hình pydantic.
"""
input: str # Đây là văn bản ví dụ
tool_calls: List[BaseModel] # Các trường hợp của mô hình pydantic cần được trích xuất
def tool_example_to_messages(example: Example) -> List[BaseMessage]:
"""Chuyển đổi một ví dụ thành một danh sách các thông điệp có thể được cung cấp cho một LLM.
Đoạn mã này là một adapter chuyển đổi ví dụ của chúng tôi thành một danh sách các thông điệp
có thể được cung cấp cho một mô hình trò chuyện.
Danh sách các thông điệp cho mỗi ví dụ tương ứng với:
1) HumanMessage: chứa nội dung từ đó nội dung cần phải được trích xuất.
2) AIMessage: chứa thông tin được trích xuất từ mô hình
3) ToolMessage: chứa xác nhận cho mô hình rằng mô hình đã yêu cầu công cụ đúng cách.
ToolMessage là bắt buộc vì một số mô hình trò chuyện được siêu tối ưu hóa cho các tác nhân
thay vì cho một trường hợp sử dụng trích xuất.
"""
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 [
"You have correctly called this tool."
] * 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
Tiếp theo, hãy định nghĩa các ví dụ của chúng ta và sau đó chuyển chúng thành định dạng thông điệp.
examples = [
(
"Biển rộng lớn và màu xanh. Nó sâu hơn 20.000 feet. Có rất nhiều cá trong đó.",
Person(name=None, height_in_meters=None, hair_color=None),
),
(
"Fiona đi xa từ Pháp đến Tây Ban Nha.",
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]})
)
Hãy thử nghiệm theo yêu cầu
prompt.invoke({"text": "đây là một số văn bản", "examples": messages})
ChatPromptValue(messages=[SystemMessage(content="Bạn là một thuật toán trích xuất chuyên gia. Chỉ trích xuất thông tin liên quan từ văn bản. Nếu bạn không biết giá trị của một thuộc tính được yêu cầu trích xuất, hãy trả về giá trị null cho thuộc tính đó."), HumanMessage(content="Đại dương rộng lớn và màu xanh biển. Nó sâu hơn 20,000 feet. Có rất nhiều cá trong đó."), 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='Bạn đã gọi đúng công cụ này.', tool_call_id='c75e57cc-8212-4959-81e9-9477b0b79126'), HumanMessage(content='Fiona đã đi xa từ Pháp đến Tây Ban Nha.'), 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='Bạn đã gọi đúng công cụ này.', tool_call_id='69da50b5-e427-44be-b396-1e56d821c6b0'), HumanMessage(content='đây là một số văn bản')])
Tạo một bộ trích xuất
Ở đây, chúng ta sẽ tạo một bộ trích xuất bằng cách sử dụng 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: Chức năng `with_structured_output` hiện đang ở phiên bản beta. Nó đang được phát triển tích cực, vì vậy giao diện lập trình có thể thay đổi.
warn_beta(
Không có ví dụ
Lưu ý rằng mặc dù chúng ta đang sử dụng gpt-4, nhưng nó vẫn thất bại với một trường hợp thử rất đơn giản!
for _ in range(5):
text = "Hệ Mặt Trời rất lớn, nhưng Trái đất chỉ có 1 mặt trăng."
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=[]
Có ví dụ
Các ví dụ tham chiếu giúp sửa chữa sự cố!
for _ in range(5):
text = "Hệ Mặt Trời rất lớn, nhưng Trái đất chỉ có 1 mặt trăng."
print(runnable.invoke({"text": text, "examples": messages}))
people=[]
people=[]
people=[]
people=[]
people=[]
runnable.invoke(
{
"text": "Tên tôi là Harrison. Màu tóc của tôi là đen.",
"examples": messages,
}
)
Data(people=[Person(name='Harrison', hair_color='đen', height_in_meters=None)])