( 教学 )Agent 构建 Prompt(提示词)3. StructuredOutputParser (结构化输出)

StructuredOutputParser 小于 1.0 版本,推荐使用 PydanticOutputParser 大于 1.0

StructuredOutputParser“结构化输出解析器”是一款非常有用的工具,它能够将大型语言模型(LLM)的响应格式化为字典结构,从而能够以键/值对的形式返回多个字段。

虽然 PydanticJSON解析器具备强大的功能,但StructuredOutputParser“结构化输出解析器”对于功能较弱的模型(例如参数较少的本地模型)尤其有效。对于与像 GPTClaude这样的高级模型相比智能程度较低的模型而言,它尤其有益。

通过使用结构化输出解析器,开发人员可以在各种 LLM 应用程序中保持数据的完整性和一致性,即使是在使用参数数量较少的模型时也是如此。

使用 ResponseSchemaStructuredOutputParser(0.3版本以前的写法,1.0版本已经弃用,改为更加现代化的方式)

  • 使用 ResponseSchema类定义响应模式,以包含用户问题的答案和所使用的来源(网站)的 description

  • 使用 response_schemas初始化 StructuredOutputParser,以根据定义的响应模式构建输出结构。

[注意]
在使用本地模型时,Pydantic解析器可能经常无法正常工作。在这种情况下,使用 StructuredOutputParser可以作为一个很好的替代解决方案。

所以对于这个情况后,在1.0版本中,推荐使用更加现代化的方式来实现结构化输出解析器。PydanticOutputParser 是一个基于 Pydantic 模型的解析器,它可以将 LLM 的响应解析为符合定义的 Pydantic 模型的实例。

现代化的结构化输出解析器 (1.0版本及以后)

方式1:使用 Pydantic 模型(推荐)

最灵活且功能最强大的方式,支持字段验证和嵌套结构:

from pydantic import BaseModel, Field
class ResponseSchema(BaseModel):
    answer: str = Field(description="用户问题的答案")
    source: str = Field(description="所使用的来源(网站)的描述")

方式2:使用 TypedDict(简洁)

当你不需要运行时验证时的轻量级方式:

from typing_extensions import TypedDict, Annotated

class ResponseSchema(TypedDict):
    answer: Annotated[str, Field(description="用户问题的答案")]
    source: Annotated[str, Field(description="所使用的来源(网站)的描述")]

使用方式1:使用 ResponseSchema

from langchain.agents import create_agent
from langchain_openai  import ChatOpenAI

Qwen2_5_7B_Instruct_llm = ChatOpenAI(
    temperature=0.1,  # 控制输出的随机性和创造性,值越低输出越稳定可预测,值越高输出越有创意但可能偏离预期 (范围: 0.0 ~ 2.0)
    model_name="Qwen/Qwen2.5-7B-Instruct",  # 硅基流动支持的模型名称
    openai_api_key=os.getenv("SILICONFLOW_API_KEY"),  # 从环境变量获取API密钥
    openai_api_base="https://api.siliconflow.cn/v1"  # 硅基流动API的基础URL
)
template="尽可能好地回答用户的问题。\n{format_instructions}\n{question}"

agent = create_agent(
    model=Qwen2_5_7B_Instruct_llm,
    response_format=ResponseSchema,  # Agent 最终返回结构化格式
    system_prompt=system_prompt
)
agent.invoke({"question": "世界上最大的沙漠是什么?"})

使用方式2:使用 PydanticOutputParser

from langchain.agents import create_agent
from langchain_openai  import ChatOpenAI
from langchain_core.output_parsers import PydanticOutputParser

Qwen2_5_7B_Instruct_llm = ChatOpenAI(
    temperature=0.1,  # 控制输出的随机性和创造性,值越低输出越稳定可预测,值越高输出越有创意但可能偏离预期 (范围: 0.0 ~ 2.0)
    model_name="Qwen/Qwen2.5-7B-Instruct",  # 硅基流动支持的模型名称
    openai_api_key=os.getenv("SILICONFLOW_API_KEY"),  # 从环境变量获取API密钥
    openai_api_base="https://api.siliconflow.cn/v1"  # 硅基流动API的基础URL
)
template="尽可能好地回答用户的问题。\n{format_instructions}\n{question}"

parser = PydanticOutputParser(pydantic_object=ResponseSchema)
prompt = template.format(format_instructions=parser.get_format_instructions())

chain = prompt | Qwen2_5_7B_Instruct_llm | output_parser  # 连接提示词、模型和输出解析器

# 提问:"世界上最大的沙漠是什么?"
chain.invoke({"question": "世界上最大的沙漠是什么?"})

使用流式输出

使用 chain.stream方法来接收对 question的流式响应:“一支足球队有多少名球员?”

for chunk in chain.stream({"question": "一支足球队有多少名球员?"}):
    print(chunk)
名球员?"
```python
for chunk in chain.stream({"question": "一支足球队有多少名球员?"}):
    print(chunk)
<think>好的,我现在需要帮用户解决如何设计和编写结构化提示词以优化Agent Prompt的性能的问题。首先,我需要回顾用户提供的引用内容,看看有哪些相关的信息可以利用。用户提到了结构化Prompt的重要性,包括角色、任务、要求等部分,还提到了模块化Prompt、思维链(CoT)和递归提示等方法。 首先,我应该明确结构化Prompt的基本框架,这可能包括角色定义、任务分解、具体要求、约束条件和输出示例。根据引用[1]和[2],结构化Prompt需要像写文章一样,有明确的标题和子标题,分块处理。比如用户提到的角色、任务、要求等部分,这些都需要清晰分开。 接下来,用户的问题是关于Agent的,所以可能需要考虑Agent的特殊性。Agent通常需要处理复杂的任务,可能需要多步骤的思考或工具调用。引用[4]提到思维链和递归提示,这可能适用于Agent的场景,比如让Agent分步骤思考或递归解决问题。 然后,我需要考虑如何将这些元素结合起来。比如,在结构化提示中明确Agent的角色,分解任务为步骤,加入思维链引导逐步处理,同时设定具体格式要求和工具调用规范。引用[3]提到Agent本质是Prompt工程,所以可能需要强调模块化和分块处理,每个模块负责不同功能。 另外,用户可能需要具体的例子来理解如何编写。比如,引用中的示例快速排序代码和结构,可以类比到Prompt结构化设计。同时,性能优化方面,引用[3]提到RAG和数据飞轮,可能需要建议结合外部知识库或数据迭代。 还要注意用户的引用[1]提到提示词生成器,作为工具帮助生成高质量的Prompt,可能建议用户使用或参考这样的工具来优化他们的设计。 最后,确保回答符合用户的要求:结构清晰,分步骤,真实可靠。可能需要分点说明设计步骤,每个步骤结合引用中的内容,并给出示例,比如一个结构化Agent Prompt模板。同时,生成的相关问题要围绕结构化PromptAgent性能优化展开,帮助用户进一步探索。</think># 结构化提示词设计方法(Agent场景) ## 一、设计原则 根据结构化Prompt的核心要素[^1][^2],建议采用以下分层结构: **1. 角色定义层** ```text [角色] 你是一个具备多领域知识的智能助手,需要完成复杂任务分解、工具调用和决策验证三大核心功能。专业领域覆盖金融数据分析、科研文献解读和工程方案设计。 ``` **2. 任务分解层** ```python # 采用思维链(CoT)格式[^4] 任务流程: 1. 接收用户原始指令 2. 解析需求类型(需调用分类器模块) 3. 根据类型选择工具库: - 数据分析类 => 调用Python执行器 - 知识查询类 => 激活RAG检索模块[^3] 4. 执行结果验证(置信度需>90%) ``` **3. 格式规范层** $$格式要求 = \begin{cases} 响应包含: & 任务状态码(HTTP标准) \\ & 执行步骤日志 \\ & 最终结论(带置信度评分) \\ 时间限制: & 单任务\leq5秒 \\ 错误处理: & 自动重试\leq3次 \end{cases}$$ ## 二、优化技巧 1. **模块化设计**:将复杂任务拆分为独立的功能单元[^2] ```text [工具调用规范] <<数学计算模块>> 输入格式:Latex公式 输出要求:保留计算过程+最终结果 精度标准:浮点数保留4位小数 <<知识检索模块>> 检索范围:2020年后权威期刊 引用格式:[序号]作者(年份) ``` 2. **动态上下文管理** ```python # 递归提示实现[^4] def context_manager(query): if contains_formula(query): activate_module(&#39;math_solver&#39;) elif needs_external_data(query): trigger_rag(retrieval_count=3) ``` 3. **验证反馈机制** $$验证流程 = 执行结果 \rightarrow 逻辑校验 \rightarrow 置信度评估 \rightarrow \begin{cases} \geq90\% & 直接输出 \\ 60-89\% & 标注存疑点 \\ \leq59\% & 请求人工干预 \end{cases}$$ ## 三、完整模板示例 ```text [系统角色] 专业医疗诊断辅助Agent,集成最新临床指南和病例数据库 [核心能力] 1. 症状-疾病关联分析(基于贝叶斯网络) 2. 药物相互作用检查 3. 诊疗方案生成 [输入规范] - 症状描述:按发生时间排序 - 患者特征:年龄/性别/病史 - 特殊要求:过敏药物等 [处理流程] 1. 症状标准化 → 2. 生成鉴别诊断 → 3. 验证诊断合理性 [输出要求] 诊断报告包含: - 首要诊断(置信度%) - 备选诊断(按概率排序) - 推荐检查清单 - 风险警示(如有) [质量保障] - 引用指南版本:[2023 NCCN指南] - 更新频率:每周同步PubMed最新文献 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值