Giải phân tích
Các mô hình ngôn ngữ có khả năng tuân thủ các hướng dẫn mẫu có thể được giao nhiệm vụ đầu ra thông tin theo định dạng đã cho.
Phương pháp này dựa trên việc thiết kế các hướng dẫn tốt, sau đó phân tích đầu ra của các mô hình ngôn ngữ để làm cho chúng trích xuất thông tin một cách tốt.
Ở đây, chúng ta sẽ sử dụng Claude, một mô hình tuyệt vời trong việc tuân theo hướng dẫn! Xem thêm tại các mô hình anthropic.
from langchain_anthropic.chat_models import ChatAnthropic
model = ChatAnthropic(model_name="claude-3-sonnet-20240229", temperature=0)
gợi ý: Tất cả các xem xét tương tự về chất lượng trích xuất áp dụng cho phương pháp phân tích. Hãy xem xét các hướng dẫn về chất lượng trích xuất.
Hướng dẫn này được thiết kế để đơn giản, nhưng thường nên bao gồm các ví dụ tham chiếu để tối ưu hóa hiệu suất!
Sử dụng PydanticOutputParser
Bên dưới là ví dụ sử dụng PydanticOutputParser
tích hợp để phân tích đầu ra của mô hình trò chuyện.
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):
"""Thông tin về một người."""
name: str = Field(..., description="Tên của người")
height_in_meters: float = Field(
..., description="Chiều cao của người được biểu thị bằng mét."
)
class People(BaseModel):
"""Thông tin nhận dạng về tất cả những người trong một văn bản."""
people: List[Person]
parser = PydanticOutputParser(pydantic_object=People)
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"Trả lời truy vấn của người dùng. Bọc đầu ra trong thẻ `json`\n{format_instructions}",
),
("human", "{query}"),
]
).partial(format_instructions=parser.get_format_instructions())
Hãy xem xem thông tin nào sẽ được gửi đến mô hình
query = "Anna năm nay 23 tuổi và cô ấy cao 1m83"
print(prompt.format_prompt(query=query).to_string())
Hệ thống: Trả lời truy vấn của người dùng. Bọc đầu ra trong thẻ `json`
Đầu ra nên được định dạng dưới dạng một ví dụ JSON tuân theo schema JSON dưới đây.
Ví dụ, với schema {"properties": {"foo": {"title": "Foo", "description": "a list of strings", "type": "array", "items": {"type": "string"}}}, "required": ["foo"]}
đối tượng {"foo": ["bar", "baz"]} là một ví dụ định dạng tốt của schema. Đối tượng {"properties": {"foo": ["bar", "baz"]}} không định dạng tốt.
Dưới đây là schema đầu ra:
{"description": "Thông tin nhận dạng về tất cả những người trong một văn bản.", "properties": {"people": {"title": "People", "type": "array", "items": {"$ref": "#/definitions/Person"}}}, "required": ["people"], "definitions": {"Person": {"title": "Person", "description": "Thông tin về một người.", "type": "object", "properties": {"name": {"title": "Name", "description": "Tên của người", "type": "string"}, "height_in_meters": {"title": "Height In Meters", "description": "Chiều cao của người được biểu thị bằng mét.", "type": "number"}}, "required": ["name", "height_in_meters"]}}}
Con người: Anna năm nay 23 tuổi và cô ấy cao 1m83
chain = prompt | model | parser
chain.invoke({"query": query})
People(people=[Person(name='Anna', height_in_meters=1.83)])
Tự phân tích tùy chỉnh
Dễ dàng tạo một prompt và trình phân tích tùy chỉnh với LangChain
và LCEL
.
Bạn có thể sử dụng một hàm đơn giản để phân tích đầu ra từ mô hình!
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):
"""Thông tin về một người."""
name: str = Field(..., description="Tên của người")
height_in_meters: float = Field(
..., description="Chiều cao của người được biểu hiện bằng mét."
)
class People(BaseModel):
"""Thông tin xác định về tất cả mọi người trong một đoạn văn bản."""
people: List[Person]
prompt = ChatPromptTemplate.from_messages(
[
(
"system",
"Trả lời truy vấn của người dùng. Đầu ra câu trả lời của bạn là JSON phù hợp với schema đã cho: ```json\n{schema}\n```. "
"Hãy chắc chắn để bao quanh câu trả lời trong các dấu ```json và ```",
),
("human", "{query}"),
]
).partial(schema=People.schema())
def extract_json(message: AIMessage) -> List[dict]:
"""Trích xuất nội dung JSON từ một chuỗi trong đó JSON được nhúng giữa các dấu ```json và ```.
Parameters:
text (str): Văn bản chứa nội dung JSON.
Returns:
list: Một danh sách các chuỗi JSON đã trích xuất.
"""
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"Không thể phân tích: {message}")
query = "Anna 23 tuổi và cô ấy cao 1,83 mét"
print(prompt.format_prompt(query=query).to_string())
System: Trả lời truy vấn của người dùng. Đầu ra câu trả lời của bạn là JSON phù hợp với schema đã cho: \`\`\`json
{'title': 'People', 'description': 'Thông tin xác định về tất cả mọi người trong một đoạn văn bản.', 'type': 'object', 'properties': {'people': {'title': 'People', 'type': 'array', 'items': {'$ref': '#/definitions/Person'}}}, 'required': ['people'], 'definitions': {'Person': {'title': 'Person', 'description': 'Thông tin về một người.', 'type': 'object', 'properties': {'name': {'title': 'Name', 'description': 'Tên của người', 'type': 'string'}, 'height_in_meters': {'title': 'Height In Meters', 'description': 'Chiều cao của người được biểu hiện bằng mét.', 'type': 'number'}}, 'required': ['name', 'height_in_meters']}}}
\`\`\`. Hãy chắc chắn để bao quanh câu trả lời trong các dấu \`\`\`json và \`\`\`
Human: Anna 23 tuổi và cô ấy cao 1,83 mét
chain = prompt | model | extract_json
chain.invoke({"query": query})
[{'people': [{'name': 'Anna', 'height_in_meters': 1.83}]}]
Các Thư Viện Khác
Nếu bạn đang quan tâm đến việc trích xuất bằng cách tiếp cận phân tích, hãy kiểm tra thư viện Kor. Được viết bởi một trong những người duy trì LangChain
, nó giúp xây dựng một prompt có tính chất mẫu, cho phép kiểm soát định dạng (ví dụ, JSON hoặc CSV) và biểu diễn schema bằng TypeScript. Dường như hoạt động khá tốt!