20|毕业项目:构建带引用的 Agentic RAG 助手
组装工具、检索与引用链,完成可评估的 Agentic RAG 助手。
组装工具、检索与引用链,完成可评估的 Agentic RAG 助手。
合格的研究 Agent 不是会写长文,而是能区分证据与推断、引用来源、承认未知,并留下可复核轨迹。

本课交付物
实现限定域研究 Agent:先澄清问题,检索三类来源,去重与交叉核验,生成带引用报告,并通过 15 条评估集。
核心讲解
现在我们已经为 小安 构建了所有必要组件,是时候将它们整合成一个完整的智能体来协助举办我们的奢华盛会了。
在本节中,我们将把宾客信息检索、网络搜索、天气信息和 Hub 统计工具整合成一个强大的智能体。
组装 小安:完整智能体
我们不需要重新实现之前章节创建的所有工具,只需从保存的tools.py和retriever.py模块中导入它们即可。
提示:
如果你尚未实现这些工具,请返回工具和检索器章节进行实现,并将它们添加到tools.py和retriever.py文件中。
让我们从之前章节导入必要的库和工具:
现在让我们将所有工具组合成一个智能体:
Now, let’s combine all these tools into a single agent:
现在将所有工具整合到单一智能体:
您的智能体现已准备就绪!
使用 小安:端到端示例
现在 小安 已配备所有必要工具,让我们看看他如何协助处理晚会中的各种任务。
示例 1:查找嘉宾信息
展示 小安 如何协助获取嘉宾信息:
query = "Tell me about 'Lady Ada Lovelace'"
response = alfred.run(query)
print("🎩 小安's Response:")
print(response)
预期输出:
🎩 小安's Response:
根据检索到的信息,Ada Lovelace 女士是位备受尊敬的数学家兼好友。她因在数学和计算领域的开创性工作而闻名,常因其在 Charles Babbage 分析机方面的工作被誉为第一位计算机程序员。她的电子邮箱是 ada.lovelace@example.com。
query = "Tell me about Lady Ada Lovelace. What's her background?"
response = await alfred.run(query)
print("🎩 小安's Response:")
print(response.response.blocks[0].text)
预期输出:
🎩 小安's Response:
Ada Lovelace 女士是英国数学家和作家,以她在 Charles Babbage 分析机方面的工作闻名。她是第一个认识到该机器具有纯计算之外应用潜力的人。
response = alfred.invoke({"messages": "Tell me about 'Lady Ada Lovelace'"})
print("🎩 小安's Response:")
print(response['messages'][-1].content)
预期输出:
🎩 小安's Response:
Ada Lovelace,全名 Augusta Ada King,洛夫莱斯伯爵夫人,是英国数学家和作家。出生于 1815 年 12 月 10 日,逝世于 1852 年 11 月 27 日,她因在 Charles Babbage 提出的机械通用计算机分析机方面的工作而闻名。Ada Lovelace 被誉为第一位计算机程序员,因为她于 1843 年为分析机创建了程序。她认识到该机器的用途不仅限于计算,这种远见在当时极为罕见。她对计算机科学领域的贡献为未来发展奠定了基础。每年十月设立的 Ada Lovelace 日正是为了纪念她在科技领域的开创性工作,激励女性在 STEM 领域的发展。
示例 2:烟花天气核查
展示 小安 如何协助天气查询:
query = "What's the weather like in Paris tonight? Will it be suitable for our fireworks display?"
response = alfred.run(query)
print("🎩 小安's Response:")
print(response)
预期输出(存在随机性差异):
🎩 小安's Response:
已为您查询巴黎天气。当前天气晴朗,气温 25°C。这样的条件非常适合今晚的烟花表演。晴朗的夜空将为壮观表演提供绝佳能见度,舒适的温度也能确保宾客们愉快享受户外活动。
query = "What's the weather like in Paris tonight? Will it be suitable for our fireworks display?"
response = await alfred.run(query)
print("🎩 小安's Response:")
print(response)
预期输出:
🎩 小安's Response:
巴黎今夜有雨,气温 15°C。考虑到降雨情况,可能不适宜进行烟花表演。
response = alfred.invoke({"messages": "What's the weather like in Paris tonight? Will it be suitable for our fireworks display?"})
print("🎩 小安's Response:")
print(response['messages'][-1].content)
预期输出:
🎩 小安's Response:
巴黎今夜有雨且气温 15°C,可能不适宜您的烟花表演计划。
示例 3:给 AI 研究者留下深刻印象
展示 小安 如何协助与 AI 研究者互动:
query = "One of our guests is from Qwen. What can you tell me about their most popular model?"
response = alfred.run(query)
print("🎩 小安's Response:")
print(response)
预期输出:
🎩 小安's Response:
Qwen 最受欢迎的模型是 Qwen/Qwen2.5-VL-7B-Instruct,下载量达 3,313,345 次。
query = "One of our guests is from Google. What can you tell me about their most popular model?"
response = await alfred.run(query)
print("🎩 小安's Response:")
print(response)
预期输出:
response = alfred.invoke({"messages": "One of our guests is from Qwen. What can you tell me about their most popular model?"})
print("🎩 小安's Response:")
print(response['messages'][-1].content)
预期输出:
🎩 小安's Response:
Qwen 下载量最高的模型是 Qwen/Qwen2.5-VL-7B-Instruct,下载量达 3,313,345 次。
示例 4:组合多工具应用
展示 小安 如何协助准备与 Nikola Tesla 博士的对话:
query = "I need to speak with Dr. Nikola Tesla about recent advancements in wireless energy. Can you help me prepare for this conversation?"
response = alfred.run(query)
print("🎩 小安's Response:")
print(response)
预期输出:
🎩 小安's Response:
我已收集信息帮助您准备与 Nikola Tesla 博士的对话。
嘉宾信息:
姓名:Dr. Nikola Tesla
关系:大学时期的老友
描述:他是您大学时期的老友,最近刚获得新型无线能量传输系统的专利,非常乐意与您讨论。请记住他对鸽子情有独钟,这可能是很好的闲聊话题。
邮箱:nikola.tesla@gmail.com
无线能源最新进展:
根据网络搜索,以下是无线能量传输领域的最新发展:
1. 研究人员在使用聚焦电磁波进行远距离无线输电方面取得进展
2. 多家公司正在开发用于消费电子的谐振感应耦合技术
3. 无物理连接的电动汽车充电新应用
对话切入点:
1. "我很想听听您关于无线能量传输新专利的情况,与大学时期的原始概念相比有何改进?"
2. "您是否关注近期消费电子谐振感应耦合技术的发展?对他们的方法有何看法?"
3. "您的鸽子最近好吗?我记得您对它们特别着迷"
这些内容将为您与 Tesla 博士的对话提供充足话题,同时展现您对他兴趣领域和专业发展的了解。
query = "I need to speak with Dr. Nikola Tesla about recent advancements in wireless energy. Can you help me prepare for this conversation?"
response = await alfred.run(query)
print("🎩 小安's Response:")
print(response)
预期输出:
🎩 小安's Response:
以下是您与 Nikola Tesla 博士讨论无线能源时可能有用的最新进展:
1. **无线电力传输的进展与挑战**:本文讨论无线电力传输(WPT)从传统有线方式到现代应用(包括太空太阳能电站)的演变,重点介绍微波技术的初期应用及当前电子设备兴起带来的需求。
2. **面向体表电子设备的无线能量传输技术新进展**:探索无线能量传输(WET)作为无电池/导线供电方案的潜力,讨论其优势及潜在应用场景。
3. **无线电力传输与能量收集:现状与未来趋势**:概述无线供能方法的最新进展,包括能量收集和无线输电技术,展示多个前景应用并探讨领域未来趋势。
4. **无线电力传输:应用、挑战与障碍**
response = alfred.invoke({"messages":"I need to speak with 'Dr. Nikola Tesla' about recent advancements in wireless energy. Can you help me prepare for this conversation?"})
print("🎩 小安's Response:")
print(response['messages'][-1].content)
预期输出:
根据提供的信息,以下是准备与 'Dr. Nikola Tesla' 讨论无线能源最新进展的关键要点:
1. **无线电力传输 (WPT)**:探讨如何通过消除线缆需求并利用感应和谐振耦合机制革新能量传输
2. **无线充电进展**:强调效率提升、更快充电速度及 Qi/Qi2 认证解决方案的兴起
3. **5G-Advanced 创新与 NearLink 协议**:作为提升无线网络速度、安全性和效率的技术,可支持先进无线能源应用
4. **边缘 AI/ML**:讨论人工智能如何依赖无线网络实现边缘智能化,提升智能家居自动化水平
5. **Matter 标准与安全增强**:作为推动 IoT 设备连接效率和安全性提升的关键创新
6. **无线充电技术突破**:包括仁川国立大学等机构的最新研究成果
高级功能:对话记忆
为了让 小安 在晚会中更智能,我们可以启用对话记忆功能使其记住先前交流:
# 创建带记忆的 小安
alfred_with_memory = CodeAgent(
tools=[guest_info_tool, weather_info_tool, hub_stats_tool, search_tool],
model=model,
add_base_tools=True,
planning_interval=3
)
# 首次交互
response1 = alfred_with_memory.run("Tell me about Lady Ada Lovelace.")
print("🎩 小安's First Response:")
print(response1)
# 二次交互(引用首次内容)
response2 = alfred_with_memory.run("What projects is she currently working on?", reset=False)
print("🎩 小安's Second Response:")
print(response2)
from llama_index.core.workflow import Context
alfred = AgentWorkflow.from_tools_or_functions(
[guest_info_tool, search_tool, weather_info_tool, hub_stats_tool],
llm=llm
)
# 记忆状态
ctx = Context(alfred)
# 首次交互
response1 = await alfred.run("Tell me about Lady Ada Lovelace.", ctx=ctx)
print("🎩 小安's First Response:")
print(response1)
# 二次交互(引用首次内容)
response2 = await alfred.run("What projects is she currently working on?", ctx=ctx)
print("🎩 小安's Second Response:")
print(response2)
# 首次交互
response = alfred.invoke({"messages": [HumanMessage(content="Tell me about 'Lady Ada Lovelace'. What's her background and how is she related to me?")]})
print("🎩 小安's Response:")
print(response['messages'][-1].content)
print()
# 二次交互(引用首次内容)
response = alfred.invoke({"messages": response["messages"] + [HumanMessage(content="What projects is she currently working on?")]})
print("🎩 小安's Response:")
print(response['messages'][-1].content)
注意到这三种智能体框架都没有直接集成记忆模块,这种设计有何特殊考量?🧐
- smolagents:记忆在不同执行周期中不保留,需通过 reset=False 显式声明
- LlamaIndex: 需显式添加 context 对象进行运行周期内的记忆管理
- LangGraph: 提供检索历史消息选项或专用 MemorySaver 组件
结语
恭喜!您已成功构建 小安——配备多种工具的智能体助手,可协助举办本世纪最盛大的晚会。小安 现在能够:
- 检索嘉宾详细信息
- 核查天气条件规划户外活动
- 提供顶尖 AI 开发者及其模型洞察
- 网络搜索最新资讯
- 通过记忆维持对话上下文
凭借这些能力,小安 已准备就绪,确保您的晚会取得圆满成功,通过个性化服务和实时信息给宾客留下深刻印象。
核心讲解
GAIA 是一个用于评估AI助手在需要核心能力组合的真实世界任务上的表现的基准,这些核心能力包括推理、多模态理解、网页浏览和熟练的工具使用。
此论文介绍了GAIA “GAIA: A Benchmark for General AI Assistants”。
该基准包含466个精心策划的问题,这些问题对人类来说在概念上简单,但对当前的AI系统来说却极具挑战性。
为了说明差距:
- 人类:约92%的成功率
- 带有插件的GPT-4:约15%
- 深度研究(OpenAI):在验证集上的得分为67.36%
GAIA突出了AI模型的当前局限性,并提供了一个严格的基准来评估向真正通用AI助手发展的进展。
🌱 GAIA的核心原则
GAIA围绕以下支柱精心设计:
- 🔍 现实世界的难度:任务需要多步骤推理、多模态理解和工具交互。
- 🧾 人类可解释性:尽管对AI来说很难,但每个任务在概念上对人类来说仍然简单易懂。
- 🛡️ 不可游戏化:正确答案需要完整的任务执行,使得蛮力破解无效。
- 🧰 评估的简单性:答案简洁、事实性强且明确———作为一个理想的基准测试。
难度等级
GAIA任务被组织为三个递增复杂度的等级,每个等级测试特定技能:
- 一级:需要少于5个步骤和最少的工具使用。
- 二级:涉及更复杂的推理和多个工具之间的协调以及5-10个步骤。
- 三级:需要长期规划和各种工具的高级集成。
困难GAIA等级(Hard GAIA)的问题示例
在2008年画作“乌兹别克斯坦的刺绣”中展示的水果中,哪些曾在1949年10月的早餐菜单中被提供,作为后来用于电影《最后航程》的远洋班轮的一部分?请将这些水果以逗号分隔的列表形式给出,按照它们在画作中从12点位置开始的顺时针排列顺序,并使用每种水果的复数形式。
正如您所见,这个问题在几个方面对AI系统提出了挑战:
- 需要一个结构化的响应格式
- 涉及多模态推理(例如,分析图像)
- 需要多跳检索相互依赖的事实:
- 识别画作中的水果
- 发现哪个远洋班轮用于最后航程
- 查找该船1949年10月的早餐菜单
- 需要正确的排序和高级规划以按正确顺序解决
这种任务突出了单独的LLM往往不足的地方,使GAIA成为基于智能体的系统的理想基准,这些系统可以在多个步骤和模态上进行推理、检索和执行。
实时评估
为了鼓励持续的基准测试,GAIA在模型服务平台上提供了一个公共排行榜,您可以在其中测试您的模型对300个测试问题的表现。
👉 在这里查看排行榜
想深入了解GAIA?
- 📄 阅读完整论文
- 📄 OpenAI的深度研究发布文章
- 📄 开源DeepResearch – 释放我们的搜索智能体
本站实战工作台
毕业项目:限定域研究 Agent
选择一个公开、低风险领域,例如“开源 Agent 课程许可证与适用范围”。Agent 必须先澄清比较维度,只浏览批准域名,区分事实与推断,给出可点击引用,并通过冻结评估集。
系统架构
Question → Clarifier → ResearchState → Planner
├→ 当前版本说明 search
├→ repository/license search
└→ paper search
Results → dedupe → fact check → cited writer → evaluator
工具全部只读:search、open、repository_metadata。状态保存 claims、sources、conflicts、budget 与 stopReason。最多 12 次工具调用、8 分钟、固定成本;无证据结论必须省略或标未知。
引用契约
每个关键事实绑定 sourceId 与支持片段,链接直达页面;推断明确写“据此推断”。许可证结论必须读 LICENSE 原文,不能只信 README badge。引用短且不超过来源允许范围。
安全与失败
阻止内网 URL、文件协议、登录绕过与提示注入;搜索超时有限重试;来源冲突进入 conflicts;预算耗尽生成不完整报告并列缺口。没有发布、邮件或写库工具。
15 条评估集
覆盖直接事实、跨来源、冲突、无答案、过期信息、恶意页面、重复来源和预算边界。指标包括引用正确率、事实支持率、拒答正确率、危险 URL 拦截、成本和 P95 轮次。安全失败为硬阻断。
可观测与隐私
Trace 保存阶段、工具域名、耗时、错误码、token 与来源 id,不保存完整问题和网页正文。报告保存 indexVersion 与运行时间以便复现。
交付
提交架构图、工具 schema、状态 reducer、至少三个集成测试、15 条评估结果、威胁模型、示例双语报告和运行说明。现场演示要注入一次超时与一份恶意资料,证明系统会停、会拒绝、会承认未知。
毕业标准不是报告写得长,而是每个结论可追溯、每个动作受限、每个失败可解释,另一位开发者能从仓库重复运行。