from langchain.agents import create_agent
from langchain.agents.middleware import dynamic_prompt, ModelRequest
from langchain_core.tools import BaseTool, tool
from typing import TypedDict
import json
from init_llm import deepseek_llm
工具1:模拟查询订单信息
@tool
def 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_ascii=False)
else:
return f"错误:未找到订单 {order_id}。"
工具2:模拟检索常见问题解答
@tool
def 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 answer
return f"未找到与'{keyword}'直接相关的政策,请尝试其他关键词或联系人工客服。"
定义运行时上下文的数据结构
class AgentContext(TypedDict):
query_type: str # 用于动态判断问题类型,例如 'normal'(普通用户) 或 'vip'(vip用户)
动态提示词中间件:根据问题类型调整Agent的"角色"和回答策略
@dynamic_prompt
def 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":
针对复杂或需要升级处理的问题
print('11111111111111111111111。')
else:
print('22222222222222222222222')
if name == "main":
"""创建客服助手Agent"""
创建带有动态提示词中间件的Agent
agent = create_agent(
model=deepseek_llm,
tools=query_order_info, search_faq, # 工具列表
middleware=dynamic_support_prompt, # 挂载动态提示词中间件
context_schema=AgentContext # 关联上下文schema
)
"""演示动态提示词效果"""
user_query = "我的订单ORD123456还没收到,包装破损了怎么办?"
user_query = "我的订单ORD654321已签收,但是物品坏了怎么办?"
print(f"用户问题:{user_query}\n")
print("场景一:vip客服模式 (query_type: 'normal')")
result_normal = agent.invoke(
{"messages": {"role": "user", "content": user_query}},
c # 标准模式
)
print("result_normal:", result_normal)
提取Agent的最后一条回复
final_response_normal = result_normal"messages"-1.content
print(final_response_normal)
D:\Users\msi\miniconda3\python.exe D:\nanobot-main\langchain-demo\bg16.py
用户问题:我的订单ORD654321已签收,但是物品坏了怎么办?
场景一:vip客服模式 (query_type: 'normal')
11111111111111111111111。