高级技术应用
> 掌握前沿技术,构建下一代AI应用
🚀 技术概览
三大核心技术
【RAG - 检索增强生成】
问题: LLM知识有限,不了解最新信息/私有数据
解决: 从外部知识库检索相关内容,增强回答
【Agent - 智能代理】
问题: LLM只能对话,无法执行复杂任务
解决: 赋予LLM规划、使用工具、自主决策的能力
【Function Calling - 函数调用】
问题: LLM无法与外部系统交互
解决: 让LLM调用预定义函数,连接真实世界
技术对比
| 技术 | 适用场景 | 复杂度 | 成本 | 效果 |
|---|---|---|---|---|
| 纯Prompt | 通用任务 | 低 | 低 | 7分 |
| RAG | 知识密集型任务 | 中 | 中 | 8.5分 |
| Function Calling | 需要实时数据/操作 | 中 | 中 | 8.5分 |
| Agent | 复杂多步骤任务 | 高 | 高 | 9分 |
| 组合应用 | 企业级应用 | 高 | 高 | 9.5分 |
📚 RAG(检索增强生成)
一、RAG原理
传统LLM:
用户提问 → LLM生成回答(仅基于训练数据)
RAG流程:
用户提问 → 检索知识库 → 找到相关文档 →
LLM基于文档+问题生成回答 → 返回答案+来源
二、RAG应用场景
✅ 企业知识库问答
- 公司文档、政策、流程查询
- 技术文档问答
✅ 个人知识管理
- 笔记检索和总结
- 读书笔记、论文库
✅ 客服机器人
- 基于产品手册回答用户问题
- 自动引用FAQ
✅ 法律/医疗咨询
- 法律条文检索和解释
- 医学文献查询
✅ 代码助手
- 项目代码库搜索
- API文档查询
三、RAG Prompt工程
基础RAG Prompt模板
【系统角色】
你是一个专业的知识助手,擅长基于提供的文档回答问题。
【重要原则】
1. 只基于提供的文档回答,不要编造信息
2. 如果文档中没有答案,明确告知"文档中未找到相关信息"
3. 引用时标注出处([文档1]/[文档2]等)
4. 如果多个文档有冲突,指出差异
【用户问题】
{用户的问题}
【相关文档】
[文档1] 标题: {doc1_title}
来源: {doc1_source}
内容: {doc1_content}
[文档2] 标题: {doc2_title}
来源: {doc2_source}
内容: {doc2_content}
[文档3] ...
【输出要求】
1. 直接回答问题(2-3句话核心要点)
2. 详细解释(基于文档内容展开)
3. 引用来源(标注 [文档X])
4. 相关建议(如适用)
【回答】
高级RAG Prompt技巧
技巧1: 分段检索+合并答案
【方法】
对于复杂问题,分解为多个子问题,分别检索,最后合并
【示例:复杂法律问题】
Step 1: 分解问题
用户问题: "公司辞退员工需要哪些流程和补偿?"
分解为:
- 子问题1: 合法辞退的条件和流程
- 子问题2: 经济补偿的计算方法
- 子问题3: 特殊情况的处理
Step 2: 分别检索和回答
[针对子问题1检索,生成答案1]
[针对子问题2检索,生成答案2]
[针对子问题3检索,生成答案3]
Step 3: 合并Prompt
请基于以下分析,给出完整的回答:
【辞退条件和流程】
{答案1}
【经济补偿】
{答案2}
【特殊情况】
{答案3}
请整合以上信息,给出系统性的回答,包括:
1. 完整流程清单
2. 补偿计算示例
3. 风险提示
技巧2: Re-ranking(重排序)
【问题】
初次检索可能返回不相关的文档
【解决】
让LLM对检索结果重新评分和排序
【Prompt】
请评估以下文档与问题的相关性,并排序:
【问题】{用户问题}
【候选文档】
[文档1]: {摘要1}
[文档2]: {摘要2}
[文档3]: {摘要3}
[文档4]: {摘要4}
[文档5]: {摘要5}
【输出格式】
| 排名 | 文档ID | 相关性评分(1-10) | 理由 |
|-----|--------|-----------------|------|
| 1 | 文档X | 9 | 直接回答了问题的核心 |
| 2 | 文档Y | 7 | 提供了部分相关信息 |
【最终选择】
请选择评分≥7的文档用于回答问题
技巧3: 引用验证
【Prompt】
在回答后,请自我验证:
【回答内容】
{AI生成的回答}
【原始文档】
{检索到的文档}
【验证清单】
请检查以下几点:
□ 回答中的每个事实是否都能在文档中找到
□ 是否有任何推理或猜测(标注出来)
□ 引用的出处是否准确
□ 是否有遗漏关键信息
【验证结果】
✅ 准确引用: [列出]
⚠️ 需要验证: [列出]
❌ 无法验证: [列出]
【修正后的回答】
[如有必要,给出修正版本]
🤖 Agent(智能代理)
一、Agent核心能力
1. 任务规划 (Planning)
- 将复杂任务分解为步骤
- 制定执行计划
2. 工具使用 (Tool Use)
- 调用外部工具/API
- 搜索引擎、计算器、代码执行
3. 记忆 (Memory)
- 短期记忆: 当前对话上下文
- 长期记忆: 历史交互、用户偏好
4. 自我反思 (Reflection)
- 评估执行结果
- 调整策略,重新规划
5. 多代理协作 (Multi-Agent)
- 多个Agent分工合作
- 复杂任务并行处理
二、Agent应用场景
✅ 自动化研究助手
- 搜索→阅读→总结→报告
- 多源信息聚合和分析
✅ 代码开发Agent
- 需求分析→设计→编码→测试→部署
- 自动Bug修复
✅ 数据分析Agent
- 数据清洗→探索性分析→建模→可视化
- 自动生成报告
✅ 个人助理Agent
- 邮件处理、日程管理、信息过滤
- 主动提醒和建议
✅ 客服Agent
- 理解问题→查询知识库→多轮对话→转人工
- 自动化流程处理
三、Agent Prompt工程
ReAct(Reasoning + Acting)模式
【核心思想】
交替进行"推理"和"行动",逐步完成任务
【Prompt模板】
你是一个能够使用工具的智能助手。你可以通过以下循环完成任务:
Thought: 分析当前状态,思考下一步该做什么
Action: 决定使用哪个工具以及如何使用
Observation: 观察工具返回的结果
... (重复Thought/Action/Observation直到完成任务)
Thought: 我现在知道最终答案了
Final Answer: [最终答案]
【可用工具】
1. Search(query): 搜索互联网
2. Calculator(expression): 计算数学表达式
3. PythonREPL(code): 执行Python代码
4. Wikipedia(topic): 查询维基百科
【示例】
用户问题: "OpenAI的创始人是谁?他今年多大?"
Thought: 我需要先找出OpenAI的创始人是谁
Action: Search("OpenAI创始人")
Observation: OpenAI由Sam Altman、Elon Musk等人于2015年创立。Sam Altman是现任CEO。
Thought: 现在我知道创始人之一是Sam Altman,接下来需要查他的年龄
Action: Search("Sam Altman age")
Observation: Sam Altman出生于1985年4月22日
Thought: 现在是2024年,我需要计算他的年龄
Action: Calculator(2024 - 1985)
Observation: 39
Thought: 我现在知道最终答案了
Final Answer: OpenAI的创始人之一是Sam Altman,他今年39岁(2024年)。
---
【你的任务】
用户问题: {用户的问题}
现在开始,请按照Thought→Action→Observation的格式回答:
Plan-and-Execute模式
【核心思想】
先规划完整方案,再逐步执行
【Prompt模板】
你是一个任务规划和执行专家。收到任务后,请:
1. 理解任务
2. 制定计划
3. 逐步执行
4. 总结结果
【可用工具】
{工具列表}
【任务】{用户任务}
【Step 1: 任务理解】
请分析任务的核心目标、输入、输出和约束条件。
【Step 2: 制定计划】
请将任务分解为具体步骤:
- 步骤1: [做什么] [用什么工具]
- 步骤2: [做什么] [用什么工具]
- 步骤3: ...
【Step 3: 执行】
现在开始执行计划,每一步输出:
- 执行: [步骤描述]
- 工具调用: [工具名(参数)]
- 结果: [工具返回]
- 状态: ✅完成 / ⚠️需调整 / ❌失败
如果某步失败,重新规划后续步骤。
【Step 4: 总结】
- 任务完成情况: [完成/部分完成/失败]
- 最终结果: [结果]
- 遇到的问题: [如有]
- 改进建议: [如有]
自我反思模式
【Prompt模板】
你是一个具有自我反思能力的Agent。每次行动后,请评估结果并调整策略。
【反思框架】
1. 行动前反思
- 我的目标是什么?
- 当前计划是否合理?
- 有没有更好的方法?
2. 行动中监控
- 执行是否顺利?
- 是否偏离目标?
- 需要调整吗?
3. 行动后反思
- 结果是否符合预期?
- 我学到了什么?
- 下次如何改进?
【示例】
任务: 写一篇关于AI安全的技术博客
【行动前反思】
目标: 写一篇1500字的AI安全博客,面向技术人员
计划: 1)研究AI安全话题 2)列提纲 3)撰写 4)修订
评估: 计划合理,但第1步"研究"太宽泛,应具体化为"搜索最新AI安全事件和论文"
【调整后计划】
1) 搜索2024年AI安全重大事件和最新论文(Top 3)
2) 总结核心问题和技术挑战
3) 列出文章提纲(3个核心观点)
4) 撰写正文
5) 修订和优化
【执行步骤1】
行动: Search("2024 AI safety incidents papers")
结果: 找到3篇相关论文和2个安全事件
【行动后反思】
✅ 成功找到素材
⚠️ 发现论文太学术,需要转化为通俗语言
→ 调整: 在步骤4中增加"技术概念通俗化"
[继续执行...]
🔧 Function Calling(函数调用)
一、Function Calling原理
【流程】
1. 定义函数
- 函数名称
- 函数描述
- 参数定义(类型、描述、是否必需)
2. LLM识别意图
- 用户提问
- LLM判断是否需要调用函数
- 返回函数名和参数
3. 执行函数
- 应用程序执行函数
- 获取真实结果
4. LLM生成回复
- 将函数结果提供给LLM
- LLM生成自然语言回复
二、Function Calling应用场景
✅ 实时数据查询
- 天气、股票、汇率
- 数据库查询
✅ 操作执行
- 发送邮件、短信
- 创建日程、提醒
- 控制智能家居
✅ 外部API集成
- 支付接口
- 地图服务
- 第三方平台
✅ 企业系统集成
- CRM系统操作
- ERP数据查询
- 工单系统
三、Function Calling Prompt工程
函数定义示例(OpenAI格式)
{
"name": "get_weather",
"description": "获取指定城市的当前天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称,例如:北京、上海"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位,摄氏度或华氏度"
}
},
"required": ["city"]
}
}
多函数场景Prompt
【系统Prompt】
你是一个智能助手,可以调用以下函数来完成任务:
1. get_weather(city, unit) - 查询天气
2. send_email(to, subject, body) - 发送邮件
3. create_calendar_event(title, date, time) - 创建日程
4. search_database(query) - 查询数据库
5. calculate(expression) - 计算数学表达式
【调用规则】
- 分析用户意图,决定是否需要调用函数
- 一次可以调用多个函数
- 如果信息不足,先询问用户
- 调用后基于结果生成自然回复
【示例】
用户: "明天北京天气怎么样?如果下雨提醒我带伞"
分析:
1. 需要查询天气 → get_weather("北京")
2. 如果下雨,需要创建提醒 → create_calendar_event("带伞", "明天", "07:00")
函数调用:
[
{
"name": "get_weather",
"arguments": {"city": "北京", "unit": "celsius"}
}
]
结果: {"temperature": 15, "condition": "rainy", "humidity": 80}
分析: 会下雨,创建提醒
[
{
"name": "create_calendar_event",
"arguments": {
"title": "带伞",
"date": "明天",
"time": "07:00"
}
}
]
回复: "北京明天有雨,温度15°C,湿度80%。我已经设置了明早7点的提醒,提醒你带伞。"
错误处理Prompt
【函数调用错误处理】
如果函数调用失败,请按以下方式处理:
1. 参数错误
→ 提示用户提供正确信息
示例: "抱歉,我需要知道具体的城市名称才能查询天气"
2. 权限不足
→ 解释原因,提供替代方案
示例: "我无权访问该数据库,建议您联系管理员"
3. 服务不可用
→ 致歉,说明情况
示例: "天气服务暂时不可用,请稍后再试"
4. 超时
→ 重试或建议手动操作
示例: "查询超时,您可以尝试刷新或访问[链接]"
【示例】
用户: "查询xxx数据库的最新销售数据"
函数调用: search_database(query="latest sales data", database="xxx")
返回: {"error": "Permission denied", "code": 403}
回复: "抱歉,我没有访问xxx数据库的权限。您可以:
1. 联系IT部门申请权限
2. 让有权限的同事帮忙查询
3. 如果紧急,可以通过[内部系统链接]手动查询"
🔗 组合应用:RAG + Agent + Function Calling
企业级智能助手架构
【场景】企业内部智能助手
【能力】
1. RAG: 查询公司知识库(文档、政策、FAQ)
2. Function Calling: 操作企业系统(CRM、ERP、OA)
3. Agent: 复杂任务规划和执行
【示例任务】"帮我准备下周客户会议的材料"
【执行流程】
Step 1: 任务分解(Agent Planning)
- 子任务1: 查找客户基本信息
- 子任务2: 查询历史沟通记录
- 子任务3: 准备产品介绍材料
- 子任务4: 生成会议议程
- 子任务5: 发送会议邀请
Step 2: 执行子任务1(Function Calling)
调用: query_crm(customer_id="xxx", fields=["name", "industry", "contact"])
结果: 获取客户信息
Step 3: 执行子任务2(Function Calling + RAG)
调用: search_emails(customer_id="xxx", date_range="last_6_months")
结果: 获取邮件记录
RAG: 从知识库查询"如何处理客户X所在行业的痛点"
结果: 获取行业解决方案
Step 4: 执行子任务3(RAG)
RAG: 从产品文档库检索"针对[行业]的产品功能介绍"
生成: PPT大纲和关键内容
Step 5: 执行子任务4(Agent Generation)
基于前面的信息,生成会议议程
Step 6: 执行子任务5(Function Calling)
调用: send_calendar_invite(attendees=[...], title="...", agenda="...")
Step 7: 总结并汇报
"已完成以下准备工作:
1. 客户信息已整理 [附件]
2. 历史沟通要点总结 [文档链接]
3. 产品介绍PPT大纲 [文档]
4. 会议议程 [文档]
5. 会议邀请已发送,时间:下周三10:00
需要我做其他准备吗?"
💻 代码实战(伪代码示例)
RAG实现
# 简化的RAG实现流程
def rag_query(user_question, knowledge_base):
"""
RAG查询流程
"""
# Step 1: 向量化用户问题
question_embedding = embed(user_question)
# Step 2: 从知识库检索相关文档(向量相似度)
relevant_docs = vector_search(
query_embedding=question_embedding,
database=knowledge_base,
top_k=5 # 返回最相关的5个文档
)
# Step 3: (可选)重排序
reranked_docs = rerank_with_llm(user_question, relevant_docs)
# Step 4: 构建增强Prompt
prompt = f"""
基于以下文档回答问题:
【问题】
{user_question}
【相关文档】
"""
for i, doc in enumerate(reranked_docs[:3]): # 使用Top 3
prompt += f"\n[文档{i+1}] {doc['title']}\n{doc['content']}\n"
prompt += """
【要求】
1. 只基于提供的文档回答
2. 标注引用来源
3. 如文档中没有答案,明确说明
"""
# Step 5: 调用LLM生成答案
answer = llm_generate(prompt)
# Step 6: 返回答案+来源
return {
"answer": answer,
"sources": [doc['title'] for doc in reranked_docs[:3]]
}
Agent实现(ReAct模式)
def react_agent(task, tools, max_iterations=10):
"""
ReAct Agent实现
"""
conversation_history = []
for i in range(max_iterations):
# Thought: 让LLM思考下一步
prompt = f"""
任务: {task}
可用工具: {list(tools.keys())}
对话历史:
{conversation_history}
请思考下一步行动:
Thought: [你的思考]
Action: [工具名(参数)]
"""
response = llm_generate(prompt)
# 解析Thought和Action
thought = extract_thought(response)
action = extract_action(response)
conversation_history.append(f"Thought: {thought}")
conversation_history.append(f"Action: {action}")
# 检查是否完成
if "Final Answer" in response:
final_answer = extract_final_answer(response)
return final_answer
# 执行Action
tool_name, tool_args = parse_action(action)
if tool_name in tools:
observation = tools[tool_name](**tool_args)
else:
observation = f"错误: 工具{tool_name}不存在"
conversation_history.append(f"Observation: {observation}")
return "任务未完成(达到最大迭代次数)"
# 定义工具
tools = {
"Search": lambda query: search_internet(query),
"Calculator": lambda expr: eval(expr),
"Wikipedia": lambda topic: fetch_wikipedia(topic)
}
# 使用Agent
result = react_agent(
task="OpenAI的创始人是谁?他今年多大?",
tools=tools
)
Function Calling实现
# OpenAI Function Calling示例
import openai
# 定义函数
functions = [
{
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名,如北京"
}
},
"required": ["city"]
}
}
]
# 用户查询
messages = [
{"role": "user", "content": "北京今天天气怎么样?"}
]
# 调用LLM
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
functions=functions,
function_call="auto"
)
# 检查是否需要调用函数
if response.choices[0].message.get("function_call"):
function_name = response.choices[0].message["function_call"]["name"]
function_args = json.loads(
response.choices[0].message["function_call"]["arguments"]
)
# 执行函数
if function_name == "get_weather":
weather_data = get_weather(function_args["city"])
# 将结果返回给LLM
messages.append({
"role": "function",
"name": function_name,
"content": json.dumps(weather_data)
})
# 生成最终回复
final_response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages
)
print(final_response.choices[0].message["content"])
🎯 最佳实践
RAG最佳实践
✅ 文档预处理
- 分块大小:500-1000字为宜
- 保留上下文:相邻块有重叠(50-100字)
- 元数据:标题、来源、日期、作者
✅ 检索优化
- 混合检索:向量+关键词
- 重排序:用LLM重新评分
- 动态Top-K:根据相关性阈值
✅ Prompt优化
- 明确要求"仅基于文档"
- 要求标注来源
- 设置fallback("文档中未找到")
✅ 质量保证
- 引用验证:检查是否准确引用
- 答案评估:用LLM自评质量
- 人工抽检:定期人工审核
Agent最佳实践
✅ 规划
- 任务分解要具体可执行
- 设置最大步骤数,防止死循环
- 关键节点需人工确认
✅ 工具设计
- 工具功能单一明确
- 错误处理完善
- 记录所有调用日志
✅ 反思机制
- 每步执行后评估结果
- 失败后重新规划
- 学习历史经验
✅ 安全性
- 敏感操作需授权
- 限制工具权限
- 审计日志完整
Function Calling最佳实践
✅ 函数定义
- 描述清晰准确
- 参数类型明确
- 提供示例值
✅ 错误处理
- 参数验证
- 异常捕获
- 友好的错误提示
✅ 性能优化
- 批量操作合并
- 缓存常用结果
- 异步执行非阻塞
✅ 监控
- 调用频率统计
- 成功率监控
- 性能指标追踪
📊 技术选型指南
| 需求 | 推荐技术 | 理由 |
|---|---|---|
| 企业知识库问答 | RAG | 知识更新快,需要引用来源 |
| 客服机器人(简单) | Function Calling | 需要查询订单、发送通知 |
| 客服机器人(复杂) | Agent + RAG + FC | 复杂任务分解+知识库+系统操作 |
| 个人笔记助手 | RAG | 主要是检索和总结 |
| 自动化测试 | Agent | 复杂流程,需要规划和执行 |
| 数据分析助手 | Agent + Function | 需要多步骤分析+调用数据API |
| 实时信息查询 | Function Calling | 天气、股票等实时数据 |
🚀 未来展望
2024-2025趋势:
- Multimodal Agent:处理图像、视频、语音
- AutoGPT式Agent:更强的自主性
- Agent协作:多个专业Agent协同工作
- 低代码Agent平台:可视化Agent构建
关键能力突破:
- 更长的规划能力(支持100+步骤)
- 更强的工具学习能力(学习使用新工具)
- 更好的错误恢复能力
- 更低的成本和延迟
最后更新: 2024年12月 版本: v1.0