跳到主要内容

高级技术应用

> 掌握前沿技术,构建下一代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+步骤)
- 更强的工具学习能力(学习使用新工具)
- 更好的错误恢复能力
- 更低的成本和延迟

返回: README | 目录总览


最后更新: 2024年12月 版本: v1.0