一个面向有限本地语料库的、单智能体、工具调用型 Agentic RAG 原型--关于agent的实践调研报告

项目地址:sec-jay/paper_agent-mvp: just a try for my study

不是聊天机器人,也不是一个完整的科研系统(我认为一个完整的科研系统应该包含多个智能体,就像一个成熟的科研课题组会有好几个人来分工,导师来统筹,甚至有时候还会包含"大导"和"小导")

可以用我这个agent做什么

运行代码如下

ini 复制代码
cd C:\Users\Administrator\Desktop\paper_agent

Set-ExecutionPolicy -Scope Process Bypass
..venv\Scripts\Activate.ps1

$env:LLM_API_KEY="你的DeepSeek API Key"(我用的是deepseek的模型,做测试便宜)
$env:LLM_BASE_URL="https://api.deepseek.com"
$env:LLM_MODEL="deepseek-v4-flash"

python agent.py --check
python -m pip install -r requirements.txt
python agent.py

运行之后是这样的画面

我们输入问题":RAG 和 Agent 有什么区别?"

输出结果如下

python 复制代码
(.venv) PS C:\Users\Administrator\Desktop\paper_agent> python agent.py
论文 Agent 已启动|模型:deepseek-v4-flash
输入 quit 退出,输入 clear 清空上下文。

你:RAG 和 Agent 有什么区别?

[第 1 轮] → 工具:search_papers
  参数:{"query": "Retrieval-Augmented Generation RAG", "top_k": 3}
  结果:{"query": "Retrieval-Augmented Generation RAG", "corpus_size": 6, "count": 1, "match_confidence": "high", "coverage_note": "已扫描全部 6 条本地记录。低相关结果不能证明语料包含用户需要的事实。", "results": [{"paper_id": "rag-2020", "title": "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks", "year": 2020, "score": 20.0, "summary_preview": "论文把生成模型的参数化知识与外部检索得到的非参数化知识结合,用检索结果支撑知识密集型生成任务。"}]}

[第 1 轮] → 工具:search_papers
  参数:{"query": "Agent 智能体 自主推理 行动", "top_k": 3}
  结果:{"query": "Agent 智能体 自主推理 行动", "corpus_size": 6, "count": 3, "match_confidence": "high", "coverage_note": "已扫描全部 6 条本地记录。低相关结果不能证明语料包含用户需要的事实。", "results": [{"paper_id": "react-2022", "title": "ReAct: Synergizing Reasoning and Acting in Language Models", "year": 2022, "score": 28.0, "summary_preview": "ReAct 让语言模型交替产生推理与行动:模型先判断下一步,再与知识库或环境交互,并根据观察结果更新后续行动。"}, {"paper_id": "reflexion-2023", "title": "Reflexion: Language Agents with Verbal Reinforcement Learning", "year": 2023, "score": 5.0, "summary_preview": "Reflexion 让语言 Agent 根据任务反馈形成文字化反思,并把反思保存在后续尝试可使用的记忆中。"}, {"paper_id": "gpt3-2020", "...

[第 2 轮] → 工具:read_paper
  参数:{"paper_id": "rag-2020"}
  结果:{"paper_id": "rag-2020", "title": "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks", "authors": ["Patrick Lewis", "Ethan Perez", "Aleksandra Piktus", "Fabio Petroni"], "year": 2020, "url": "https://arxiv.org/abs/2005.11401", "keywords": ["RAG", "retrieval-augmented generation", "检索增强生成", "外部知识", "retrieval"], "summary": "论文把生成模型的参数化知识与外部检索得到的非参数化知识结合,用检索结果支撑知识密集型生成任务。", "contribution": "说明模型可以在生成前获取外部证据;今天很多 Agent 的搜索和知识库工具沿用了这一基本思路。", "limitations": "RAG 主要解决知识获取问题,不等于完整 Agent;它不必自主规划多个动作。"}

[第 2 轮] → 工具:read_paper
  参数:{"paper_id": "react-2022"}
  结果:{"paper_id": "react-2022", "title": "ReAct: Synergizing Reasoning and Acting in Language Models", "authors": ["Shunyu Yao", "Jeffrey Zhao", "Dian Yu", "Nan Du"], "year": 2022, "url": "https://arxiv.org/abs/2210.03629", "keywords": ["ReAct", "reasoning", "acting", "推理", "行动", "agent loop", "工具调用"], "summary": "ReAct 让语言模型交替产生推理与行动:模型先判断下一步,再与知识库或环境交互,并根据观察结果更新后续行动。", "contribution": "清楚展示了 Thought/Action/Observation 式循环,是理解现代 LLM Agent 行动循环的重要工作。", "limitations": "显式轨迹可能冗长,行动质量仍受模型能力、工具描述和环境反馈影响。"}

[第 2 轮] → 工具:read_paper
  参数:{"paper_id": "reflexion-2023"}
  结果:{"paper_id": "reflexion-2023", "title": "Reflexion: Language Agents with Verbal Reinforcement Learning", "authors": ["Noah Shinn", "Federico Cassano", "Ashwin Gopinath", "Karthik Narasimhan"], "year": 2023, "url": "https://arxiv.org/abs/2303.11366", "keywords": ["Reflexion", "reflection", "反思", "memory", "记忆", "feedback", "agent"], "summary": "Reflexion 让语言 Agent 根据任务反馈形成文字化反思,并把反思保存在后续尝试可使用的记忆中。", "contribution": "展示了反馈、反思和跨尝试记忆如何帮助 Agent 调整行为。", "limitations": "反思内容同样可能错误;增加循环并不自动保证正确,还需要评价信号和停止条件。"}

Agent:## 结论

基于本地语料,RAG 与 Agent 不是同一层面的东西:**RAG 是一种"检索→增强生成"的技术组件,解决知识获取问题;Agent 是一种"自主决策→行动→观察→再决策"的工作范式,解决多步完成任务的问题**。二者可以被组合使用,而不是互斥选项。

具体区别可以从三点看:

| 维度 | RAG(rag-2020) | Agent(react-2022 等) |
|---|---|---|
| 控制流 | 相对固定的"先检索证据、再生成"流程,不需要自主规划多个动作 | Thought/Action/Observation 式循环:自主决定下一步动作,根据观察更新后续行动 |
| 能力范围 | 主要解决**外部知识获取**(抗幻觉、时效性) | 需要**推理 + 行动 + 工具选择 + 反馈利用**的综合能力 |
| 记忆/反思 | 一般不涉及多轮反思记忆 | 可具备反馈→反思→记忆→再次尝试的机制(reflexion-2023) |

## 证据(本地语料)

1. **rag-2020**:RAG 把模型的参数化知识与外部检索的非参数化知识结合,用检索结果支撑知识密集型生成。语料明确注明其局限:*"RAG 主要解决知识获取问题,不等于完整 Agent;它不必自主规划多个动作"*。
2. **react-2022**:ReAct 让模型交替产生推理与行动------先判断下一步、再与知识库或环境交互、依据观察更新后续行动,即 Thought/Action/Observation 循环。
3. **reflexion-2023**:语言 Agent 可根据任务反馈形成文字化反思并存入记忆,供后续尝试使用------这超出 RAG 的范围。
4. 两者的联系也在语料中:rag-2020 的贡献说明,*"今天很多 Agent 的搜索和知识库工具沿用了(RAG 的)这一基本思路"*。因此 RAG 检索常作为 Agent 的一个工具或子组件。

## 局限

- 本地语料库仅有 6 条记录,本回答只以 RAG、ReAct、Reflexion 三篇为证据。
- "Agent 必须包含循环/规划"这类**强定义性主张**,本地语料并未给出统一的 Agent 定义,无法从当前语料确定所有流派对 Agent 的界定。
- 关于 RAG 的工程实现(向量库、混合检索、Rerank 等)以及 Agent 框架(规划器、多智能体协作等)的更细划分,本地语料没有覆盖。

## 下一步

如果需要更严谨的界定,可以补充语料,例如 Agent 综述类论文(

[累计 Token] 输入 4452|输出 1578

这个就是我们构建的agent运行示例

我做的这个小agent解决了什么问题?

系统不能直接依赖模型记忆回答,而要:

  1. 检索本地论文记录;
  2. 选择相关论文;
  3. 阅读证据;
  4. 判断证据是否充分;
  5. 根据证据回答;
  6. 必要时承认无法确定。

输入是研究问题,输出是包含结论、证据、局限和下一步的回答。

中间是要调用外部工具来做输出的,而不是直接依赖模型训练的过程

概括为:

Agent=LLM(大模型)+Instructions(提示词)+Tools(工具)+State+Loop+Guardrails

LLM

当前使用:deepseek-v4-flash

模型并不直接读取电脑文件,也不真正执行 Python 函数。它负责判断:

  • 要不要调用工具;
  • 调用哪个工具;
  • 传递什么参数;
  • 是否继续行动;
  • 什么时候停止并回答。

因此,LLM 更像 Agent 的决策核心

Agent Harness

这个部分其实就是一个agent.py文件

agent.py文件负责:

  • 把问题和工具说明发送给模型;
  • 接收模型返回的 tool_calls
  • 验证工具名称和参数;
  • 执行真正的 Python 函数;
  • 把工具结果交还模型;
  • 重复运行,直到模型停止;
  • 限制搜索次数和总轮数;
  • 记录完整执行轨迹。

我们后面加入的预算控制、动态移除工具和强制收尾,都属于 Harness,而不是模型能力。这个其实就是很像现在说的harness工程。

Instructions

这个就是chatllm最开始的时候,我理解的提示词工程里面的内容,那个时候大家都是研究怎么提升提示词的内容。

(图片来自b站-御豪同学)

这三种 方式都是SYSTEM_PROMPT的使用方式

SYSTEM_PROMPT 规定了:

  • 文献主张必须先搜索;
  • 引用必须来自真实 paper_id
  • 证据不足时必须承认;
  • 未经用户要求不能保存结论;
  • "第一、唯一、首次"等强主张必须有直接证据;
  • 最多使用两个不同搜索查询。

这些属于软约束:模型通常会遵守,但不能百分之百保证。

Tools

Agent作为决策层,当然应该有自己的"武器"

Agent 当前拥有三个工具:

工具 作用 是否改变数据
search_papers 检索整个本地语料库
read_paper 根据 paper_id 读取完整笔记
save_finding 保存有证据支持的研究结论

模型只能在这三个动作中选择,不能浏览网页、删除文件或执行任意代码。 Agent 的自主性是有边界的:

模型自主选择行动,但开发者决定它有哪些行动可以选择。

所以agent开发也是有部分要围绕tools的设计来考量。

Environment

我这个项目里面设置的环境是自主提取的json(结构化数据)

data/papers.json

其中有6条论文记录,包括:

  • Transformer
  • GPT-3
  • RAG
  • ReAct
  • Toolformer
  • Reflexion

这相当于一个极小的知识库(毕竟是我用来做agent开发模拟任务的)。

State:短期状态与持久化状态

当前有三类状态:

状态 存储位置 生命周期
对话历史 messages 程序退出后消失
执行轨迹 output/trace.jsonl 持久保存
研究结论 output/findings.jsonl 持久保存

output/trace.jsonl

我们设计的这个agent没有真正的长期对话,每次执行

arduino 复制代码
python agent.py --question "..."

都会启动一个全新的 Agent 会话。

我们的agent loop

markdown 复制代码
用户提出问题
    ↓
模型提出两个 search_papers 调用
    ↓
Python 搜索全部6条语料
    ↓
搜索预算用完,Harness 移除搜索工具
    ↓
模型选择读取3篇论文
    ↓
Python 返回完整论文笔记
    ↓
模型判断证据不足
    ↓
模型不再调用工具
    ↓
输出最终答案
复制代码
模型调用
→ 检查 tool_calls
→ 执行工具
→ 添加工具结果
→ 再次调用模型

这也是openai的官方文档里面的agent loop的完整定义

一个agent为什么也包含了RAG系统

RAG的全名为Retrieval‑Augmented Generation

中文:检索增强生成

基本过程为:

复制代码
Retrieval 检索
→ Augmentation 将结果加入上下文
→ Generation 根据结果生成

但普通的RAG流程通常是写死在工作流中的

复制代码
固定检索一次 → 固定生成一次

我们的 Agent 可以自主决定(根据任务复杂程度自主决定):

  • 使用什么查询词;
  • 搜索一次还是两次;
  • 阅读哪几篇;
  • 是否需要继续行动;
  • 证据不足时是否停止。

因此它更准确地属于 Agentic RAG

软约束与硬约束

要让模型跳出无限调用工具的循环,必须得有约束

软约束

写在 Prompt 中:

复制代码
最多搜索两次
证据不足时必须承认
不要虚构引用

依赖模型理解和遵守。

硬约束

写在 Python 中:

复制代码
搜索调用最多2次
每次最多返回3篇
拒绝完全相同的工具调用
总工具轮数最多5轮
预算耗尽后移除工具
强制生成最终回答

无论模型是否愿意,都无法突破。

可靠的 Agent 不能只依靠 Prompt,必须有程序级约束。

Trace 告诉了我们什么

trace.jsonl 不只记录最终答案,还记录:

  • 使用了哪个模型;
  • 每次开放了哪些能力;
  • 模型请求了多少个工具;
  • 工具参数是什么;
  • 工具返回什么;
  • 消耗多少 Token;
  • 模型是主动停止还是被强制停止。

这叫 Observability。

普通大模型应用只关注"回答是什么";Agent 开发还必须关注:

它是通过什么路径得到这个回答的?

同一个正确答案,可能来自可靠证据,也可能只是碰巧猜对。

目前还不具备什么

当前项目还没有:

  • PDF 自动解析;
  • Embedding 和向量数据库;
  • 联网论文检索;
  • 长期记忆;
  • MCP;
  • 多 Agent 分工;
  • Human-in-the-loop 审批;
  • 自动化 Eval;
  • 网页界面;
  • 后台长期运行。

因此,现在不应该把它称为"全自动科研 Agent"。它是一个结构完整、范围受控的教学型 Agent MVP

通过这个项目,我们已经实际接触了:

  • LLM 与 Agent 的区别;
  • Function Calling;
  • Agent loop;
  • Tool、Action 和 Observation;
  • Agent Harness;
  • RAG 与 Agentic RAG;
  • Context 和 Memory;
  • 软约束与硬约束;
  • Tool budget;
  • Dynamic action space;
  • Graceful fallback(备选);
  • Trace 和 Observability;
  • 幻觉与证据边界;
  • 模型与供应商解耦。
相关推荐
goplaysource3 小时前
IPTV 频道去重:用哈希解决"同一个频道出现十遍"的问题
github
liuyicenysabel4 小时前
从 0 到 1:一套 GitHub + GHCR + k3s 的全自动 CI/CD 流水线(Flask 项目实战)
ci/cd·flask·github
u1301305 小时前
GitHub 热榜项目:日榜(2026-08-31)
github
Justinsky6 小时前
DeepSeek Harness 开源一个月,我把它整个嵌进了 Electron 桌面软件
github
小宋10216 小时前
MCP 是什么:从零编写一个可供 AI 调用的工具服务
人工智能·github
小弥儿7 小时前
GitHub今日热榜 | 2026-09-01:迷你小模型登场
学习·microsoft·开源·github
QUOR7 小时前
Zorv AI 内置浏览器技术架构与开发指南(新版)
架构·github
u1301307 小时前
GitHub 热榜项目:日榜(2026-09-01)
github
younuo36557 小时前
广州网站搭建费用明细:域名、服务器与开发成本全解析
服务器·前端·github