LangChain入门(七) 提取和输出结构化数据
从结构化的文本中提取结构化信息,在自然语言处理中,表格数据抽取是一个重要的任务,它涉及到从文本中提取到结构化数据。
这个里面主要用到pydantic。pydantic是python中使用最广泛的数据验证库。用pydantic可以处理数据、验证数据、定义数据格式、虚拟化和反虚拟化,类型转换等。
可以通过model.with_structured_output() 可以将输出转换为结构化数据
from langchain.chat_models import init_chat_model
from langchain.prompts.chat import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from pydantic.v1 import BaseModel,Field
from typing import Optional
import os;api_key = os.environ.get("DEEPSEEK_API_KEY");
api_base = "https://api.deepseek.com/"
#定义模型
model = init_chat_model(model="deepseek-chat",api_key=api_key,api_base=api_base,temperature=0.8,max_tokens=1024,model_provider="deepseek",)#定义一个数据模型
class Person(BaseModel):""" 关于一个人的模型"""name:Optional[str]=Field(default=None,description="表示人的名字")hair_color:Optional[str] = Field(default=None,description="如果知道的话,这个人的头发颜色")height_in_meters:Optional[str] = Field(default=None ,description="以米为单位测量的高度")class ManyPerson(BaseModel):people:list[Person]# 定义自定义提示以提供指令和任何其他上下文
# 1)你可以在提示词模板中添加示例以提高提取质量
# 2)引入额外的参数以考虑上下文(例如,包括有关图区文本的文档的元数据)prompt = ChatPromptTemplate.from_messages([("system","你是一个专业的提取算法。只从未结构化文本中提取详细信息。如果你不知道要提取的属性的值,返回该属性的值为null"),("human","{text}")]
)chain = {'text':RunnablePassthrough() } |prompt| model.with_structured_output(schema=ManyPerson)text='马路上走来一个女生,长长的黑头发披在肩上,大概1米7左右.走在她旁边的是她男朋友刘海,比她高10厘米'resp=chain.invoke(text)print(resp)