首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2025-09-13 langchain学习-07 使用PydanticOutputParser自定义输出解析器

2025-09-13 langchain学习-07 使用PydanticOutputParser自定义输出解析器

原创
作者头像
用户11830194
发布2025-09-13 20:02:40
发布2025-09-13 20:02:40
4510
举报
文章被收录于专栏:langchainlangchain

有时前端会让我们返回特定格式的内容,langchain中预定义的解析器可能不符合要求,我们可以使用PydanticOutputParser自定义一个合适的输出解析器

需要的包

代码语言:bash
复制
pip install pydantic 

依然使用之前做的多轮对话模型验证,下面开始

代码语言:txt
复制
#首先要自定义你需要的数据结构
#这里是准备做一个可以交给前端绘图的json数据,要求如下:
"""
{message:{title:"这里是标题",type:"这里是绘制的图表的类型",data:[{label1:"",value1:""},{label2:"",value2:""},{label3:"",value3:""}]},type="这里是这条消息的类型,例如chartData"}
"""
from pydantic import BaseModel,Field
#从里到外定义,首先是最内层的数据点
class DataPoint(Base):
     label: str = Field(description="图表的标签或X轴上的类别名称")
     value: float = Field(description="与标签对应的数值或Y轴上的值")
     
#然后是下一层,图表信息,包含图表标题,图表类型,绘制图表用的数据
class ChartInfo(BaseModel):
     title: str = Field(description="数据图表的标题")
     type: str = Field(description="建议的图表类型, 例如 'bar', 'pie', 'line'")
     data: List[DataPoint] = Field(description="用于绘制图表的数据点列表")
     
#最外层,由图表信息和本消息的类型组成
class FinalMessage(BaseModel):
     message: ChartInfo = Field(description="包含图表所有信息的对象")
     type: str = Field(description="这条消息的整体类型, 固定为 'chartData'")
     
def main():
     #实例化pydantic解析器,将我们希望得到的数据结构传进来
     pydantic_parser=PydanticOutputParser(pydantic_object=FinalMessage)
     #获取格式化指令
     format_instructions=pydantic_parser.get_format_instructions()
     
     #创建提示词模板
     chat_template=ChatPromptTemplate.from_messages(
      [
           SystemMessagePromptTemplate.from_template("你是一个问数智能体,可以根据用户输入的在数据库中查到的数据,生成绘制数据统计图表时用的格式化数据。\n{instructions}"),
           HumanMessagePromptTemplate.from_template("{AskData}")
      ]
     )
     #注入格式化指令
     final_prompt=chat_template.partial(instructions=format_instructions)
     
     #创建提示词
     prompt=final_prompt(AskData="今天的账单如下,一日三餐吃饭一共花费60元,交通花费8元,买饮料花费12元,修理电风扇花费50元,根据这些内容绘制一个柱状图").to_messages()
     
     glm=ChatGLM3()

     full_response=""
     for chunk in glm.stream(prompt):
     print(chunk.content,end="",flush=True)
     full_response+=chunk.content
       print()
       print("*"*100)
       print(pydantic_parser.parse(full_response).model_dump_json())

if __name__=='__main__':
  main()

输出如下:

格式化前(上),格式化后(下)
格式化前(上),格式化后(下)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档