有时前端会让我们返回特定格式的内容,langchain中预定义的解析器可能不符合要求,我们可以使用PydanticOutputParser自定义一个合适的输出解析器
需要的包
pip install pydantic 依然使用之前做的多轮对话模型验证,下面开始
#首先要自定义你需要的数据结构
#这里是准备做一个可以交给前端绘图的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 删除。