当前位置: 首页 > news >正文

输出解析器和结构化输出

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

结构化输出 :对于某些用例,限制大型语言模型的输出为特定格式或结构,例如,如果输出要存储在关系数据库中,如果模型生成遵循定义的模式或格式的输出,将会容易得多。最常见的输出格式将是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': '请简要介绍下深度学习'}
http://www.jsqmd.com/news/141153/

相关文章:

  • 终极字符渲染优化方案:彻底解决游戏中文乱码显示问题
  • 线代第三章向量第一节:n维向量及其运算
  • 【C++】详解形参和实参:别再傻傻分不清
  • Dify平台的任务分解与协调逻辑揭秘
  • 线代第三章向量第二节:向量间的线性关系一
  • 一文说清时序逻辑电路时序图的读取方法
  • 联想军团工具箱终极使用教程:从入门到精通
  • 48、Spring中邮件支持:MIME消息的构建与发送
  • 反馈电路初步理解:模拟电路学习的关键一步
  • 线代第二章矩阵第九、十节:初等变换、矩阵的标准形、阶梯形与行最简阶梯形、初等矩阵
  • 49、复杂 MIME 消息发送与企业级邮件处理方案
  • Dify平台的版权侵权风险规避措施
  • Java毕设项目:基于springboot的戏曲学习管理系统(源码+文档,讲解、调试运行,定制等)
  • arm64-v8a与移动处理器的兼容性深度剖析
  • WebLLM 实战:无需后端!教你在浏览器前端直接跑 Llama-3-8B,React/Vue 项目无缝集成
  • 50、Spring 中的邮件支持与动态语言应用
  • 51、Spring动态语言与远程调用技术解析
  • Dify在信创生态中的定位与发展机遇
  • Android 手机跑大模型:基于 MLC LLM 将 DeepSeek 部署到手机端,断网也能聊天的“私人助理”
  • Dify平台对自主可控AI技术的战略意义
  • 52、Spring 远程调用:原理、实践与应用
  • SQL 注入的 10 种进阶姿势:WAF 防火墙绕过实战,你的数据库真的安全吗?
  • Java毕设项目:基于springboot的物流管理系统(源码+文档,讲解、调试运行,定制等)
  • 有源蜂鸣器和无源区分:驱动信号波形对比分析
  • 全面讲解如何判断电脑无法识别usb设备根源
  • Wi-Fi 破解原理与防御:用 Python + Scapy 抓取“握手包”并跑字典,硬核演示 WPA2 弱点
  • Vetur格式化代码的正确姿势(操作指南)
  • 通俗解释Scanner类的常用方法工作流程
  • Multisim示波器在模拟电子课程中的角色:通俗解释
  • 从热效应角度分析PCB线宽和电流的关系(工业级)