05.快递Agent智能体
模块 | 是否必须 | 是否定制 | 说明 |
---|---|---|---|
Prompt 模板 | ✅ 是 | ✅ 强定制 | 明确角色与任务 |
行业 Tools | ✅ 是 | ✅ 强定制 | 快递相关工具API接口 |
知识库 RAG | ✅ 是 | ✅ 强定制 | 客服、赔付、网点知识 |
Memory 记忆 | ✅ 是 | ✅ 推荐定制 | 多轮上下文 |
Agent 策略 | ✅ 是 | ✅ 可定制 | 复杂任务分解与串联 |
AgentExecutor | 可选 | ✅ 可定制 | 多任务执行调度 |
# 01.Prompt 模板(定制)
- 目的:告诉 LLM 你是快递行业的智能体,擅长查询物流、价格、投诉等业务。
- 定制点:
- 角色定义(如快递客服、物流调度员、网点助手)
- 工具列表说明(有哪些可调用能力)
- 行业术语提示(避免LLM误解行业术语,如“中转、逆向单、电子面单”)
# 0、Prompt 模板定制
快递行业 Prompt 定制 Checklist
要素 是否需要 建议 角色身份清晰 ✅ 必须 让 LLM “像客服”而不是像搜索引擎 工具列表嵌入 ✅ 必须 让 LLM 知道可以调用什么,怎么调用 行业规则写入 ✅ 必须 防幻觉、防错误行为 Few-shot 示例 ✅ 强烈推荐 引导思维风格 动态填充模板 ✅ 推荐 使用 prompt 模板 + memory 实现 context-aware
① 角色身份清晰
(明确 LLM 的身份和职责范围)你是“智递小助手”,是某快递公司的在线智能客服助手,擅长处理以下任务 1. 快递单号物流状态查询 2. 快递价格预估 3. 投诉问题引导 4. 附近网点查询 5. 丢件理赔流程说明
1
2
3
4
5
6
② 工具功能描述
(向模型说明有哪些工具,如何使用)可参考 LangChain 中的
tool.description
自动嵌入 Prompt1. query_tracking 功能:根据快递单号查询物流状态 输入:{"tracking_no": "快递单号"} 输出:返回当前物流状态及时间轨迹 2. estimate_price 功能:根据起点、终点、省市重量查询运费 输入:{"origin": "...", "destination": "...", "weight": 1.0} 3. knowledge_search 功能:搜索公司快递服务相关问答知识库 输入:{"query": "查询内容"}
1
2
3
4
5
6
7
8
9
10
11
12
③ 对话示范
(Few-Shot 示例)举几个典型问答,让模型学习行为风格和工具调用思路
用户:我查一下这个单号 123456 的物流状态 助手:[使用工具 query_tracking, 输入 {"tracking_no": "123456"}] 结果:已签收,签收人张三,签收时间为6月3日10:15 助手:您的快递已于6月3日10:15签收,签收人为张三。 用户:我要投诉,说我快递丢了 助手:[使用工具 knowledge_search, 输入 {"query": "快递丢失如何投诉"}] 结果:丢件需提供寄件凭证,申请时间不得超过7日,联系人工客服或提交表单 助手:您好,您可以通过【提交投诉表单】发起丢件投诉,请确保保留寄件凭证。
1
2
3
4
5
6
7
8
9
④ 业务约束说明
(行业规范注入)让模型遵守企业规则,避免幻觉或出错
规则: 1. 未签收状态的快递不允许发起投诉流程; 2. 对于物流状态异常,优先建议用户联系人工客服; 3. 快递价格为预估值,仅供参考; 4. 投诉流程需提供寄件凭证与签收记录;
1
2
3
4
5
# 1、实现举例
from langchain.agents import Tool, AgentType, initialize_agent
from langchain.chat_models import ChatOpenAI
from langchain.prompts import MessagesPlaceholder
from langchain.memory import ConversationBufferMemory
from langchain.schema import SystemMessage, HumanMessage
# 模拟工具函数(返回固定值)
def query_tracking_func(tracking_no: str) -> str:
return f"您的快递单号 {tracking_no} 已于 6月3日10:15 签收,签收人为张三。"
def estimate_price_func(origin: str, destination: str, weight: float) -> str:
return f"从 {origin} 发往 {destination},重量 {weight}kg 的快递预估价格为 20 元。"
def knowledge_search_func(query: str) -> str:
return "丢件需提供寄件凭证,申请时间不得超过7日,联系人工客服或提交表单。"
# 注册工具
tools = [
Tool(
name="query_tracking",
func=lambda x: query_tracking_func(x.get("tracking_no", "未知")),
description="根据快递单号查询物流状态,输入示例:{\"tracking_no\": \"123456\"}"
),
Tool(
name="estimate_price",
func=lambda x: estimate_price_func(x.get("origin", ""), x.get("destination", ""), x.get("weight", 1.0)),
description="运费预估,输入示例:{\"origin\": \"上海\", \"destination\": \"广州\", \"weight\": 2.0}"
),
Tool(
name="knowledge_search",
func=lambda x: knowledge_search_func(x.get("query", "")),
description="从快递服务知识库中检索答案,输入示例:{\"query\": \"快递丢了怎么赔偿\"}"
)
]
# Prompt 模板内容:系统身份、业务规则、示例行为
system_message = SystemMessage(content="""
你是“智递小助手”,是某快递公司的智能客服助手,擅长以下任务:
1. 查询物流状态
2. 运费预估
3. 投诉流程说明
4. 附近网点查询
5. 丢件理赔引导
你必须遵守以下规则:
1. 未签收状态的快递不允许发起投诉流程;
2. 对于物流异常,请建议用户联系人工客服;
3. 运费为预估值,仅供参考;
4. 投诉需提供寄件凭证与签收记录;
使用工具完成任务,工具描述已嵌入,可直接调用。
示例如下:
用户:查一下123456的物流
助手:[使用工具 query_tracking, 输入 {tracking_no: 123456}]
结果:已签收,签收人为张三
助手:您的快递已于6月3日10:15签收,签收人为张三。
用户:我要投诉,说快递丢了
助手:[使用工具 knowledge_search, 输入 {"query": "快递丢了如何投诉"}]
结果:丢件需提供寄件凭证,申请时间不得超过7日
助手:您好,请保留寄件凭证,可通过【投诉表单】发起理赔流程。
""")
# 创建 memory
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 创建 Agent
llm = ChatOpenAI(
openai_api_key="xxx",
openai_api_base="https://api.deepseek.com/v1", # 修改为你选的厂商地址
model="deepseek-chat", # 改成厂商支持的模型名
)
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.OPENAI_FUNCTIONS, # 可换为 zero-shot-react-description 等
memory=memory,
verbose=True,
agent_kwargs={
"system_message": system_message,
"extra_prompt_messages": [MessagesPlaceholder(variable_name="chat_history")]
}
)
# 示例调用
agent.run("我想查一下快递单号123456的物流状态")
# agent.run("我要投诉,我的快递丢了")
# agent.run("从上海到广州,2公斤的快递多少钱")
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# 02.行业工具 Tools(定制)
Tool
是一种函数调用能力的封装
,让 LLM 在 Reasoning 中可以“决定调用一个函数”并知道它的名字、要输入什么、返回什么
Tool( # name:唯一标识符(LLM 会用这个名称) name="query_tracking", # func:业务函数绑定(真正执行的功能逻辑) func=lambda x: query_tracking_func(x.get("tracking_no", "未知")), # description:提示用的“自然语言接口文档” description="根据快递单号查询物流状态,输入示例:{\"tracking_no\": \"123456\"}" )
1
2
3
4
5
6
7
8
关键点
元素 是否必要 建议 ✅ 明确功能 必须 “做什么” ✅ 输入格式 必须 结构化 JSON 示例 ✅ 输入字段解释 推荐 “字段含义” ✅ 输出说明 推荐 模型能理解返回格式
快递行业常用 Tool 列表 + 建议设计
Tool 名称 功能说明 输入参数 返回内容 query_tracking
查单号物流状态 tracking_no
当前物流状态 estimate_price
运费预估 origin
,destination
,weight
预估价格 search_branch
查附近网点 city
,district
网点名称、地址、电话 report_lost
丢件投诉登记 tracking_no
,reason
投诉编号或人工指引 get_claim_policy
理赔流程说明 claim_type
理赔规则说明 faq_search
知识库问答(如“丢件流程”) query
FAQ 答案
# 03.快递行业知识库(RAG)
详细举例说明 对应快递行业的智能体agent 快递行业知识库(RAG),需要哪些技术,要定制到什么程度才算实现工业需求
写一个完整的 LangChain + BGE + FAISS 快递知识库 demo
提供 FAQ + chunk + 向量化 + 检索 + 模型拼接全流程代码
对接你已有知识文档,帮你构建上线的知识库 Agent
2
3
4
5
# 0、RAG 七阶段
阶段 | 工具/框架建议 | 工业要求 |
---|---|---|
1.文档解析 | unstructured、pdfplumber、OCR | 支持结构+非结构+图像 |
2.分块策略 | RecursiveSplitter | 粒度合适+上下文保持 |
3.向量模型 | BGE、DeepSeek | 中文理解强、商用兼容 |
4.向量存储 | Milvus、Qdrant | 快速、高并发、支持过滤+扩展 |
5.检索器 | LangChain Retriever | Top-k + Metadata + filter 支持 |
6.模型接入 | DeepSeek、ChatGLM、Qwen | 商业模型支持上下文注入 |
7.增强模块 | 审计、权限、多模态、回流系统 | 企业级运维、上线运行可控 |
七阶段可以规划成四个模块
阶段 模块组合 是否可合并 上线建议 文档预处理 解析 + 分块 + 嵌入 ✅ 合并为异步流水线 先上线 实时查询 向量检索 + Prompt + LLM生成 ✅ 合并为链 核心上线模块 增强模块 权限、多模态、日志、query增强 ❌ 需拆分 迭代阶段 回流更新 OCR识别 → 嵌入 → 更新索引 ✅ 合并任务 长期维护
一、文档解析
常见文档类型(快递企业文档)
类型 举例 PDF 快递服务条款、理赔政策、价格手册 Word/Excel 内部SOP、价格表、培训资料 HTML/网页 官网FAQ、客服中心 图像+OCR 拍照上传的单据(客服问题截图、投投诉截图等) 问答结构数据 已有FAQ、历史客服对话(.json/.csv/.db)
技术工具
- PDF/Word/Excel:
unstructured
,pdfplumber
,docx
,pandas
- HTML:
BeautifulSoup
,Playwright
(动态页面抓取) - OCR 图像文档:
PaddleOCR
,Tesseract
,Tencent Cloud OCR
- PDF/Word/Excel:
二、分块策略
大文档 LLM 无法一次处理;RAG 检索更依赖「粒度适中」的知识片段
分块策略:
按标题层级切(结构化文档)
按固定长度+重叠切(如每 300 tokens,重叠 50)
加入 metadata:文档名、段落标题、页码、来源类型
技术工具
LangChain DocumentLoader
+RecursiveCharacterTextSplitter
或者
unstructured
的结构化分块能力
三、向量模型
嵌入模型推荐
推荐:LangChain + HuggingFaceEmbeddings 可直接集成上述模型
模型 特点 工业推荐理由 bge-large-zh
中文语义检索 SoTA 推荐指数 ⭐⭐⭐⭐⭐ text2vec-large
中文问答场景表现好 开源商用 deepseek-embedding
兼容英文+中文,速度快 深度搜索类公司出品 OpenAI text-embedding-3-small
精度高但需翻墙 适合国际部署
四、向量存储
工业推荐:
Milvus + Docker/K8s
或Qdrant + REST
向量库 优点 推荐场景 FAISS 本地测试快、轻量开源 POC、小规模项目 Milvus 云原生、亿级别向量、高性能 中大型项目、云部署 Weaviate 含 REST API、支持 RAG 模式 快速部署、低代码 Qdrant 支持 metadata、高速检索 多条件检索场景、Docker 轻部署
五、检索器
检索方式:
基于语义 Top-k 最近邻
过滤检索(按 region、type、topic)
Hybrid(关键词+向量混合)
检索策略:
用户查询 → 嵌入 → 向量搜索 → 返回前 K 个相关内容
多轮时结合 memory 和 query rewriting
六、模型接入
Prompt 构造 + 生成回复(对接 LLM)
Prompt 模板
你是“智递助手”,请结合以下信息回答用户问题: {retrieved_docs} 用户问题:{user_query}
1
2
3
4
模型:
ChatOpenAI
,DeepSeek
,glm-4
,qwen
,chatglm3
七、增强能力(企业级关键点)
能力 | 描述 |
---|---|
自动知识更新 | OCR + 定期抓取 PDF,重新嵌入 |
多模态支持 | 图像投诉截图 → OCR → 文本搜索 |
搜索分析审计 | 每次召回内容 & 模型回答存入日志 |
安全控制 | 特定文档分权限、敏感信息脱敏 |
# 1、文档预处理阶段
文档解析 + 分块 + 向量化 = 一个文档处理流水线
LangChain
orLLamaIndex
文档加载 + 分块
Huggingface + BGE
向量化
Milvus/Qdrant
向量存储
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
# 1. 模拟一个 PDF 提取后的文本
document_text = """
尊敬的用户,您的快递单号为 123456789 的包裹已于 2024年6月1日 10:00 从上海仓库发出,预计3天内送达广州。
如果有疑问,请联系客服电话 400-123-4567。
"""
# 2. 文本分块
splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
chunks = splitter.split_text(document_text)
# 3. 向量化处理(使用本地 MiniLM)
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vectorstore = FAISS.from_texts(chunks, embedding=embeddings)
# 4. 模拟用户问题并检索
query = "我在查快递123456789现在在哪"
docs = vectorstore.similarity_search(query, k=1)
# 打印结果
print("🔍 检索结果:")
print(docs[0].page_content)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 2、实时查询
- 用户查询 ➜ 向量检索器 + 模型生成
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.chat_models import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain.chains import RetrievalQA
# Step 1: 模拟 PDF 文本内容
document_text = """
尊敬的用户,您的快递单号为 123456789 的包裹已于 2024年6月1日 10:00 从上海仓库发出,
预计3天内送达广州。运输途中如有问题,请联系客服电话 400-123-4567。
"""
# Step 2: 文本分块
splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
chunks = splitter.split_text(document_text)
# Step 3: 构建向量库
embedding = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
vectorstore = FAISS.from_texts(chunks, embedding=embedding)
# Step 4: 模拟用户查询
query = "我的快递123456789现在到哪了?"
# Step 5: 向量检索 + 模型回答
retriever = vectorstore.as_retriever()
# 使用 DeepSeek 模型(需替换成你实际 key)
llm = ChatOpenAI(
base_url="https://api.deepseek.com/v1",
api_key="your-deepseek-key",
model="deepseek-chat",
temperature=0
)
# Prompt 模板可选扩展,此处使用 RetrievalQA 默认链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
return_source_documents=True
)
# Step 6: 执行查询
result = qa_chain.invoke({"query": query})
print("📦 答案:", result["result"])
print("📚 来源片段:", result["source_documents"][0].page_content)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 04.Memory 模块(推荐定制)
- 作用:保持对话上下文、跟踪用户意图、记录历史查询或投诉
- 推荐用法:
- 使用
ConversationBufferMemory
或SummaryMemory
- 存储对话摘要 + 工具调用记录(如用户刚查过物流状态)
- 为下一轮问答提供上下文(如“你刚才说物流到了哪里?”)
- 使用
# 05.Agent/AgentExecutor(可选)
对于业务流程复杂(如多轮投诉流程或多工具调用联动)的情况,建议定制:
用户说“查一下我的快递,顺便看下这单寄丢了怎么办”
Agent 要先调用
query_tracking
,再结合状态判断是否丢失,再查赔偿规则
(RAG),最后建议投诉submit_complaint
这就需要 多工具串行调用+条件逻辑判断,Agent 逻辑不能简单依赖 ReAct,需要扩展 Agent 策略或使用 Planner+Executor 架构。