news 2026/4/16 9:25:32

输出解析器和结构化输出

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
输出解析器和结构化输出

输出解析器负责获取模型的输出并将其转换为更适合下游任务的格式。 在使用大型语言模型生成结构化数据或规范化聊天模型和大型语言模型的输出时非常有用。

结构化输出 :对于某些用例,限制大型语言模型的输出为特定格式或结构,例如,如果输出要存储在关系数据库中,如果模型生成遵循定义的模式或格式的输出,将会容易得多。最常见的输出格式将是JSON。

①.with_structured_output()

一些LangChain聊天模型支持.with_structured_output()方法。 该方法只需要一个模式作为输入,并返回一个字典或Pydantic对象。 通常,这个方法仅在支持下面描述的更高级方法的模型上存在, 并将在内部使用其中一种。它负责导入合适的输出解析器并 将模式格式化为模型所需的正确格式。

ps:这个方法目前不支持国内的deepseek模型以及Qwen的模型,这里用的是智谱的模型。

from typing import Optional from langchain_core.prompts import ChatPromptTemplate from pydantic import BaseModel,Field from langchain_demo.my_llm import llm class Joke(BaseModel): """ 搞笑段子的结构类 """ start:str=Field(decription="笑话的开头部分") punchline:str=Field(decription="笑话的包袱/笑点") rating:Optional[int]=Field(decription="笑话的有趣程序评分,范围1到10") prompt_template=ChatPromptTemplate.from_template( '帮我生成一个关于{topic}的笑话!' ) chain=prompt_template|llm.with_structured_output(Joke) resp=chain.invoke({"topic":"篮球"}) print(resp) print(type(resp)) print(resp.start) 输出结果: start='为什么篮球总是很累?' punchline='因为它总是在投篮!' rating=6 <class '__main__.Joke'> 为什么篮球总是很累?

②.SimpleJsonOutputParser()

限制模型的输出始终为某种有效的 JSON。

from langchain_classic.chains.summarize.map_reduce_prompt import prompt_template from langchain_core.output_parsers import SimpleJsonOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_demo.my_llm import llm prompt_template=ChatPromptTemplate.from_messages([ ("system", "你的输出必须始终包含\"answer\"和\"followup_question\"键的JSON对象。" "其中\"answer\"代表对用户的回答。" "\"followup_question\"代表用户可能提出的后续问题。" ), ("user","{question}") ]) chain=prompt_template|llm|SimpleJsonOutputParser() resp=chain.invoke({"question":"请简要回答下什么是深度学习"}) print(resp) print(type(resp)) 输出: --{'answer': '深度学习是机器学习的一个子领域,它使用多层神经网络结构来模拟人脑的学习过程。通过大量数据训练,这些网络能够自动学习数据的复杂特征和表示,无需人工设计特征。深度学习在图像识别、自然语言处理、语音识别等领域取得了突破性进展。', 'followup_question': '深度学习和传统机器学习有什么区别?'} --<class 'dict'>

③.工具调用

它的工作原理是首先将所需的模式直接或通过 LangChain 工具 绑定到 聊天模型,使用.bind_tools()方法。然后模型将生成一个包含与所需形状匹配的 args 的 tool_calls 字段的 AIMessage

from pydantic import BaseModel,Field from langchain_demo.my_llm import llm class ResponseFormatter(BaseModel): """用此工具来结构化你的用户响应""" answer:str=Field(decription="对用户问题的回答") followup_question:str=Field(description='用户所提出的问题') resp=llm.bind_tools([ResponseFormatter]).invoke("请简要介绍下深度学习") print(resp) print(resp.tool_calls[0]['args']) 输出结构: --content='目前我无法为您提供关于深度学习的详细介绍,因为相关的知识库查询工具暂时不可用。\n\n不过,我可以告诉您深度学习是机器学习的一个分支,它使用多层神经网络来模拟人脑的学习过程。深度学习在图像识别、自然语言处理、语音识别等领域取得了显著成就。\n\n如果您想了解更详细的信息,建议您:\n1. 查阅相关的学术资料或教科书\n2. 访问专业的AI和机器学习网站\n3. 参考在线课程平台上的深度学习课程\n\n您是否有其他我可以帮助您的问题?' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 269, 'prompt_tokens': 341, 'total_tokens': 610, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 320}, 'prompt_cache_hit_tokens': 320, 'prompt_cache_miss_tokens': 21}, 'model_provider': 'openai', 'model_name': 'deepseek-chat', 'system_fingerprint': 'fp_eaab8d114b_prod0820_fp8_kvcache', 'id': 'ef6552b8-9222-42cb-8978-33f8704124f9', 'finish_reason': 'tool_calls', 'logprobs': None} id='lc_run--019b5515-7fcb-7ab0-9978-145e91ce52ab-0' tool_calls=[{'name': 'ResponseFormatter', 'args': {'answer': '目前我无法为您提供关于深度学习的详细介绍,因为相关的知识库查询工具暂时不可用。\n\n不过,我可以告诉您深度学习是机器学习的一个分支,它使用多层神经网络来模拟人脑的学习过程。深度学习在图像识别、自然语言处理、语音识别等领域取得了显著成就。\n\n如果您想了解更详细的信息,建议您:\n1. 查阅相关的学术资料或教科书\n2. 访问专业的AI和机器学习网站\n3. 参考在线课程平台上的深度学习课程', 'followup_question': '请简要介绍下深度学习'}, 'id': 'call_00_ELKuV91YhlCSTY2KQxtEotqT', 'type': 'tool_call'}] usage_metadata={'input_tokens': 341, 'output_tokens': 269, 'total_tokens': 610, 'input_token_details': {'cache_read': 320}, 'output_token_details': {}} --{'answer': '目前我无法为您提供关于深度学习的详细介绍,因为相关的知识库查询工具暂时不可用。\n\n不过,我可以告诉您深度学习是机器学习的一个分支,它使用多层神经网络来模拟人脑的学习过程。深度学习在图像识别、自然语言处理、语音识别等领域取得了显著成就。\n\n如果您想了解更详细的信息,建议您:\n1. 查阅相关的学术资料或教科书\n2. 访问专业的AI和机器学习网站\n3. 参考在线课程平台上的深度学习课程', 'followup_question': '请简要介绍下深度学习'}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 9:50:23

Dify如何识别不同学科的专业术语?

Dify如何识别不同学科的专业术语&#xff1f; 在构建面向医学、法律、工程等专业领域的AI系统时&#xff0c;一个最常被忽视却又至关重要的问题浮出水面&#xff1a;当用户提到“vector”时&#xff0c;你希望模型想到的是数学中的向量&#xff0c;还是生物学中的基因载体&…

作者头像 李华
网站建设 2026/4/15 23:09:12

Dify如何集成第三方向量数据库?

Dify如何集成第三方向量数据库&#xff1f; 在企业加速拥抱大模型的今天&#xff0c;一个普遍的困境浮现&#xff1a;如何让通用语言模型“懂”自家的专业知识&#xff1f;微调成本高、周期长&#xff0c;且难以实时更新&#xff1b;而直接提问又常导致“一本正经地胡说八道”。…

作者头像 李华
网站建设 2026/4/16 8:44:38

线代第三章向量第二节:向量间的线性关系一

向量间的线性关系&#xff08;一&#xff09;&#xff1a;线性组合与线性表示向量间的线性关系是线性代数的核心内容&#xff0c;也是理解向量组秩、线性方程组解结构、AI 中特征维度约简&#xff08;如 PCA&#xff09;的关键。本部分先讲解线性组合和线性表示两个基础概念&am…

作者头像 李华
网站建设 2026/4/16 9:18:47

11、Puppet开发、部署与扩展:最佳实践指南

Puppet开发、部署与扩展:最佳实践指南 1. Puppet开发与部署基础 在Puppet开发过程中,我们可能会对代码进行修改。例如,通过Git操作将代码的首行改为文档注释。修改后,在开发环境中运行Puppet代理时,之前的错误不再出现: # puppet agent --test --noop --environment=…

作者头像 李华
网站建设 2026/4/16 9:21:46

20、Puppet控制台:Foreman、Puppet Enterprise Console与Puppetboard的使用指南

Puppet控制台:Foreman、Puppet Enterprise Console与Puppetboard的使用指南 1. 多Puppet主节点环境配置 在多Puppet主节点的环境中,我们需要在每个主节点上添加Foreman仓库,然后安装 foreman - proxy 包。具体步骤如下: 1. 安装 foreman - proxy 包: $ puppet re…

作者头像 李华
网站建设 2026/4/14 22:20:08

21、Puppet工具与集成指南

Puppet工具与集成指南 1. 引言 Puppet社区开发了众多工具,旨在助力用户编写更优质的模块并提升生产力。本文将介绍一系列实用工具,涵盖模块下载、部署、测试等多个方面。 2. Puppet Forge与模块工具 Puppet Forge( http://forge.puppetlabs.com/ )是一个在线的Puppet…

作者头像 李华