news 2026/4/3 16:59:47

输出解析器和结构化输出

作者头像

张小明

前端开发工程师

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/3/28 11:40:36

如何实现微信群消息自动转发:wechat-forwarding完整使用指南

如何实现微信群消息自动转发&#xff1a;wechat-forwarding完整使用指南 【免费下载链接】wechat-forwarding 在微信群之间转发消息 项目地址: https://gitcode.com/gh_mirrors/we/wechat-forwarding 在多个微信群之间手动转发重要消息既耗时又容易遗漏&#xff0c;现在…

作者头像 李华
网站建设 2026/4/1 11:30:04

Dify平台的版权侵权风险规避措施

Dify平台的版权侵权风险规避措施 在AI技术加速渗透各行各业的今天&#xff0c;企业对大语言模型&#xff08;LLM&#xff09;的应用已从实验性探索转向规模化落地。智能客服、合同辅助生成、知识库问答系统等场景中&#xff0c;AI正在承担越来越多的内容输出职责。然而&#xf…

作者头像 李华
网站建设 2026/4/4 6:37:16

28、Hiera:数据与代码分离的利器

Hiera:数据与代码分离的利器 1. Hiera基础操作 Hiera是一个强大的工具,可用于将数据与代码分离。我们可以使用调试标志运行相关命令,以查看更多详细信息。例如,使用以下命令: root@puppet-master-hiera-ubuntu:/etc/puppet/data# hiera -d puppetmaster输出结果如下: …

作者头像 李华
网站建设 2026/4/4 4:52:28

48、Spring中邮件支持:MIME消息的构建与发送

Spring中邮件支持:MIME消息的构建与发送 在邮件发送的应用场景中,我们常常会遇到各种需求。有时候,邮件可能只是简单的文本消息,但更多时候,我们需要发送包含HTML格式、嵌入式图片、附件等复杂内容的邮件。接下来,我们将详细探讨如何在Spring框架中构建和发送这些复杂的…

作者头像 李华
网站建设 2026/4/4 6:37:14

51、Spring动态语言与远程调用技术解析

Spring动态语言与远程调用技术解析 动态语言性能与可刷新Bean 在Spring中使用动态语言时,性能是一个需要关注的点。从一些调试信息可以看到不同单例Bean的获取时间: - bshTextSource Bean获取耗时52毫秒。 - textSource Bean获取耗时5毫秒。 - jrubyTextSource Be…

作者头像 李华