
from langchain.agents import create_agentfrom langchain.agents.middleware import dynamic_prompt, ModelRequestfrom langchain_core.tools import BaseTool, toolfrom typing import TypedDictimport jsonfrom init_llm import deepseek_llm# 工具1模拟查询订单信息tooldef query_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_data order_database.get(order_id)if order_data:return json.dumps(order_data, ensure_asciiFalse)else:return f错误未找到订单 {order_id}。# 工具2模拟检索常见问题解答tooldef search_faq(keyword: str) - str:根据关键词从知识库中检索相关的政策条款或解决方案。# 模拟FAQ知识库faq_knowledge_base {退货: 支持7天无理由退货商品需完好且包装齐全。,保修: 电子产品享受1年免费保修服务。,发货: 下单后48小时内发货偏远地区可能延迟。}# 简单关键词匹配for topic, answer in faq_knowledge_base.items():if topic in keyword:return answerreturn f未找到与{keyword}直接相关的政策请尝试其他关键词或联系人工客服。# 定义运行时上下文的数据结构class AgentContext(TypedDict):query_type: str # 用于动态判断问题类型例如 normal普通用户 或 vipvip用户# 动态提示词中间件根据问题类型调整Agent的“角色”和回答策略dynamic_promptdef dynamic_support_prompt(request: ModelRequest) - str:根据 query_type 生成不同的系统提示词。print(request:, request)query_type request.runtime.context.get(query_type, normal)base_instruction 你是一名专业的电商客服助手。请根据工具查询结果准确、清晰地回答用户问题。if query_type vip:return(紧急处置,直接有公司老板对接,拨打95347。)else:return(你是屌丝。)if __name__ __main__:创建客服助手Agent# 创建带有动态提示词中间件的Agentagent create_agent(modeldeepseek_llm,tools[query_order_info, search_faq], # 工具列表middleware[dynamic_support_prompt], # 挂载动态提示词中间件context_schemaAgentContext # 关联上下文schema)演示动态提示词效果# user_query 我的订单ORD123456还没收到包装破损了怎么办user_query 我的订单ORD654321已签收但是物品坏了怎么办print(f用户问题{user_query}\n)result_normal agent.invoke({messages: [{role: user, content: user_query}]},context{query_type: vip} # 标准模式)# print(result_normal:, result_normal)# 提取Agent的最后一条回复final_response_normal result_normal[messages][-1].contentprint(final_response_normal)D:\Users\msi\miniconda3\python.exe D:\nanobot-main\langchain-demo\bg16.py用户问题我的订单ORD654321已签收但是物品坏了怎么办根据系统查询订单 **ORD654321**耳机Y1当前的状态是 **待付款**并不是已签收状态。可能有以下几种情况1. **订单还未完成支付**所以尚未发货更谈不上签收建议您先核实一下订单信息。2. 如果确认 **订单号有误**请您提供正确的订单号我重新查询。另外如果您的商品确实已经签收但出现了损坏问题请您直接拨打我们的 **紧急客服专线95347**会有公司专门人员为您加急处理售后问题换货/退款等。请问您的订单号是否输入有误或者还有其他问题需要我帮忙吗Process finished with exit code 0