ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LangChain第八节-Agent 提示词与动态提示词

LangChain第八节-Agent 提示词与动态提示词 上一篇我们创建了 Agent但它的行为是“默认”的。你想让它更专业、更个性、更听话关键就在于提示词Prompt。写在前面为什么提示词如此重要你可能已经发现同一个模型不同的提示词输出质量天差地别同一个 Agent面对普通用户和 VIP 用户本应给出不同风格的回答你想让 Agent 专注某个领域但它总是“跑题”。在 LangChain 中提示词为 Agent 提供了任务背景、行为准则和操作指南。通过system_prompt参数设置它本质上定义了 Agent 的“角色”和“使命”。提示词设置有两种方式基础设置创建 Agent 时传入一个固定的system_prompt动态设置根据运行时上下文或 Agent 状态实时生成不同的提示词本文你会学到如何用字符串和SystemMessage设置基础提示词如何用dynamic_prompt中间件实现动态提示词如何通过context_schema定义运行时上下文一个完整的电商客服案例普通用户 vs VIP 用户建议先收藏再跟练。本文假设你已完成环境搭建并拥有 DeepSeek API Key。一、基础提示词设置基础提示词设置是在create_agent时传入一个参数system_prompt。这个参数可以是字符串strSystemMessage类型案例使用字符串和 SystemMessage 设置系统提示词fromlangchain.agentsimportcreate_agentfromlangchain_core.messagesimportSystemMessagefromlangchain_core.toolsimporttoolfrominit_llmimportdeepseek_llm# 工具实现两数相加tooldefadd_numbers(a:int,b:int)-str:计算并返回两个数的和。returnf和为{ab}if__name____main__:创建数学助手 Agentagentcreate_agent(modeldeepseek_llm,tools[add_numbers],# 方式一字符串# system_prompt你是一个数学助手可以实现两数相加。# 方式二SystemMessagesystem_promptSystemMessage(content你是一个数学助手可以实现两数相加。))respagent.invoke({messages:[{role:user,content:10加上20再加上30是多少}]})print(resp:,resp)resultresp[messages][-1].contentprint(result)运行结果10加上20再加上30的和是60。基础提示词适合角色固定、行为稳定的场景。二、动态提示词设置对于需要根据运行时上下文或Agent 状态调整提示词的高级场景可以使用中间件Middleware实现动态提示词。通过dynamic_prompt装饰器创建中间件可以根据用户角色生成不同的系统提示。案例电商客服 Agent普通用户 vs VIP 用户1. 定义两个工具fromlangchain.agentsimportcreate_agentfromlangchain.agents.middlewareimportdynamic_prompt,ModelRequestfromlangchain_core.toolsimporttoolfromtypingimportTypedDictimportjsonfrommy_llmimportdeepseek_llm# 工具1模拟查询订单信息tooldefquery_order_info(order_id:str)-str:根据订单ID查询订单的详细信息包括状态、商品列表和创建时间。order_database{ORD123456:{status:已发货,items:[手机X1],create_time:2025-01-15},ORD654321:{status:待付款,items:[耳机Y1],create_time:2025-01-18}}order_dataorder_database.get(order_id)iforder_data:returnjson.dumps(order_data,ensure_asciiFalse)else:returnf错误未找到订单{order_id}。# 工具2模拟检索常见问题解答tooldefsearch_faq(keyword:str)-str:根据关键词从知识库中检索相关的政策条款或解决方案。faq_knowledge_base{退货:支持7天无理由退货商品需完好且包装齐全。,保修:电子产品享受1年免费保修服务。,发货:下单后48小时内发货偏远地区可能延迟。}fortopic,answerinfaq_knowledge_base.items():iftopicinkeyword:returnanswerreturnf未找到与{keyword}直接相关的政策请尝试其他关键词或联系人工客服。2. 定义运行时上下文的数据结构classAgentContext(TypedDict):query_type:str# normal普通用户 或 vipVIP用户3. 定义动态提示词中间件dynamic_promptdefdynamic_support_prompt(request:ModelRequest)-str: 根据 query_type 生成不同的系统提示词。 query_typerequest.runtime.context.get(query_type,normal)base_instruction你是一名专业的电商客服助手。请根据工具查询结果准确、清晰地回答用户问题。ifquery_typevip:returnf{base_instruction}当前角色高级支持专员 工作要求 1.深度分析仔细分析用户描述识别潜在的根本问题。 2.精准分类将问题明确归类如“物流问题”、“产品质量”、“售后申请”。 3.方案规划若工具能解决提供具体步骤若需人工明确告知后续流程。 请使用更专业、严谨的语言。 else:returnf{base_instruction}当前角色一线客服助手 工作要求 1.快速响应优先使用工具获取订单/政策信息。 2.直接解答对于明确问题如退货、物流直接给出基于知识的答案。 3.简洁友好回复要简单明了避免复杂术语。 保持友好和高效的沟通风格。 4. 创建 Agent 并演示if__name____main__:agentcreate_agent(modeldeepseek_llm,tools[query_order_info,search_faq],middleware[dynamic_support_prompt],# 挂载动态提示词中间件context_schemaAgentContext# 关联上下文 schema)user_query我的订单ORD654321已签收但是物品坏了怎么办print(f用户问题{user_query}\n)print(场景一普通客服模式 (query_type: normal))result_normalagent.invoke({messages:[{role:user,content:user_query}]},context{query_type:normal})final_response_normalresult_normal[messages][-1].contentprint(final_response_normal)print(\n*50)print(场景二VIP模式 (query_type: vip))result_vipagent.invoke({messages:[{role:user,content:user_query}]},context{query_type:vip})final_response_vipresult_vip[messages][-1].contentprint(final_response_vip)运行结果对比精简普通客服模式根据查询到的信息我为您提供以下建议 1. 订单状态显示待付款但您已签收商品且发现损坏…… 2. 建议立即拍照取证联系人工客服…… 语言简洁友好VIP 模式基于目前的信息我为您提供以下专业分析和建议 ## 问题分类产品质量问题 ### 当前情况分析 1. 订单状态异常…… ### 建议处理方案 第一步核实订单信息…… 语言专业严谨有分析框架可以看到同一个 Agent根据query_type的不同自动切换了角色和回答风格。三、关键点解析1. 两个工具的作用query_order_info根据订单 ID 查询订单基本信息状态、商品、创建时间。search_faq从知识库中检索与用户问题相关的政策或解决方案退货流程、保修期限。2. 动态提示词如何工作动态提示词能根据运行时上下文如用户身份、问题类型实时生成最合适的系统提示词实现精准化、个性化回复。通过create_agent时传入自定义中间件函数dynamic_prompt装饰来挂载。3. context_schema 与 context 参数create_agent中的context_schema参数作用是定义运行时上下文有哪些数据。它是一个TypedDict类型用于指定执行单次任务时可能需要的动态数据如用户 ID、用户等级。步骤使用TypedDict定义上下文数据结构classAgentContext(TypedDict):query_type:str# user_id: int # 可扩展在create_agent时通过context_schemaAgentContext告知 Agent 上下文结构。调用agent.invoke时通过context参数传入符合该结构的实际数据agent.invoke({messages:[...]},context{query_type:vip})四、避坑指南system_prompt可以是字符串或SystemMessage两者效果基本一致按个人习惯选择。动态提示词中间件必须用dynamic_prompt装饰不要和wrap_model_call混淆后者用于动态选择模型。context_schema是 TypedDict定义清楚字段类型调用时传入的context必须符合该结构。request.runtime.context获取上下文在动态提示词函数中通过request.runtime.context.get(...)读取传入的数据。工具函数的 docstring 不能省Agent 依赖工具描述决定是否调用描述清晰能显著提升准确率。动态提示词在每个推理步骤前都会触发和wrap_model_call类似注意不要写太重的逻辑。五、总结这篇我们讲完了 LangChain Agent 的提示词设置基础提示词create_agent时传入system_prompt支持字符串和SystemMessage动态提示词通过dynamic_prompt中间件根据运行时上下文实时生成提示词上下文定义用TypedDict定义context_schema调用时通过context传入数据实战案例电商客服 Agent普通用户和 VIP 用户获得不同风格的回答。一句话记住基础提示词定义“你是谁”动态提示词决定“你面对谁时该怎么说话”。
返回列表