拓冰建站拓冰建站
首页 / 资讯中心 / 正文

第07章:智能体 (3)

7、Agent的高级用法3结构化输出结构化输出是Agent的核心功能之一它允许Agent以特定、可预测的格式返回数据而不是传统的自然 语言响应。通过结构化输出开发者可以直接获得 Pydantic模型 、 JSON对象 或 数据类 等结构化数 据这些数据能够被应用程序直接使用无需复杂的解析过程。7.1 模型 vs Agent的结构化输出对比第06章已经介绍过结构化输出当时的重点是与 模型对象 的绑定这里与Agent的结构化输出做对 比7.2 结构化输出的4种策略LangChain的create_agent()函数自动处理结构化输出的全过程。用户只需通过 “response_format”参 数 设置期望的输出模式Schema。当模型生成结构化数据时系统会自动捕获、验证并将结果存储在Agent状态的 structured_response 键中。def create_agent( ... response_format: Union[ ToolStrategy[StructuredResponseT], ProviderStrategy[StructuredResponseT], type[StructuredResponseT], None, ] )create_agent函数中的response_format参数支持四种不同的策略设置方式① ProviderStrategy使用模型提供商的 原生结构化输出功能 实现结构化输出。这里所说的“原生结构化输出”指的是大语言模型LLM提供商通过其API直接提供的、在模型响应 阶段就强制保证 输出格式符合预定规范 的能力这种能力能够在模型生成内容的源头确保结构化 准确性。适用于支持原生结构化输出的模型比如OpenAI、Anthropic Claude或xAI Grok等。from langchain.agents import create_agent from dotenv import load_dotenv from langchain.agents.structured_output import ProviderStrategy from langchain.chat_models import init_chat_model from pydantic import BaseModel, Field import os load_dotenv(overrideTrue) from rich import print as rprint AICODE_KEY os.getenv(AICODE_KEY) AICODE_URL os.getenv(AICODE_URL) #定义模型 model init_chat_model( model gpt-5.5, api_key AICODE_KEY, base_url AICODE_URL, ) class ContractInfo(BaseModel): 用户的联系方式 name:str Field(description用户的姓名) email:str Field(description用户的邮箱) phone:str Field(description用户的电话) agent create_agent( modelmodel, response_formatProviderStrategy(ContractInfo) ) responseagent.invoke({ messages:[{ role:user,content:从以下信息中提取用户信息小明的邮箱是2806242786qq.com 电话是10042115487 }] }) rprint(response)② ToolStrategy对于不支持原生结构化输出的模型LangChain采用“ToolStrategy”工具调用的方式实现结构化输出。此策略兼容绝大多数 支持工具调用 的现代模型其核心原理是动态创建一个 虚拟工具 该工具的输 入参数对应着期望的数据结构。当模型需要生成最终答案时系统会引导模型 调用这个虚拟工具 从而间接产生符合要求的结构化数 据。举例from langchain.agents import create_agent from dotenv import load_dotenv from langchain.chat_models import init_chat_model from pydantic import BaseModel, Field from langchain.agents.structured_output import ToolStrategy import os from rich import print as rprint load_dotenv(overrideTrue) AICODE_KEY os.getenv(AICODE_KEY) AICODE_URL os.getenv(AICODE_URL) #定义模型,调用的是ChatDeepseek() 必须关闭思考 modelinit_chat_model( modeldeepseek:deepseek-v4-pro, extra_body{thinking: {type: disabled}}, ) class ContractInfo(BaseModel): 用户的联系方式 name:str Field(description用户的姓名) email:str Field(description用户的邮箱) phone:str Field(description用户的电话) agent create_agent( modelmodel, response_formatToolStrategy(ContractInfo) ) responseagent.invoke({ messages:[{ role:user,content:从以下信息中提取用户信息小明的邮箱是2806242786qq.com 电话是10042115487 }] }) rprint(response)③ type / AutoStrategy官方没有在参数列表或官方文档列出这种策略但阅读源码可以看到。responseFormat ( ToolStrategy[SchemaT] | ProviderStrategy[SchemaT] | AutoStrategy[SchemaT] ) Union type for all supported response format strategies.当我们直接传入一个定义类型时LangChain会自动包装为AutoStrategy触发 自动选择策略 如果 模型支持原生结构化输出如OpenAI、Anthropic Claude或xAI Grok则优先使用 ProviderStrategy否则使用ToolStrategyfrom langchain.agents import create_agent from dotenv import load_dotenv from langchain.chat_models import init_chat_model from pydantic import BaseModel, Field from langchain.agents.structured_output import AutoStrategy import os from rich import print as rprint load_dotenv(overrideTrue) AICODE_KEY os.getenv(AICODE_KEY) AICODE_URL os.getenv(AICODE_URL) #定义模型,调用的是ChatDeepseek() 必须关闭思考 modelinit_chat_model( modeldeepseek:deepseek-v4-pro, extra_body{thinking: {type: disabled}}, ) class ContractInfo(BaseModel): 用户的联系方式 name:str Field(description用户的姓名) email:str Field(description用户的邮箱) phone:str Field(description用户的电话) agent create_agent( modelmodel, response_formatAutoStrategy(ContractInfo) ) responseagent.invoke({ messages:[{ role:user,content:从以下信息中提取用户信息小明的邮箱是2806242786qq.com 电话是10042115487 }] }) rprint(response)特别注意在LangChain 1.0及以上版本中直接传递模式如response_formatContactInfo不再支 持必须显式使用ToolStrategy或ProviderStrategy。经过测试目前LangChain 1.2版本还可使 用。④ None默认配置表示不以结构化输出以 自然语言 响应用户问题。总结在实际大模型Agent开发场景中如果使用到了结构化输出推荐使用 “ToolStrategy”策略 所以后续 重点介绍这种策略方式结构化输出。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门