项目地址: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解决了什么问题?
系统不能直接依赖模型记忆回答,而要:
- 检索本地论文记录;
- 选择相关论文;
- 阅读证据;
- 判断证据是否充分;
- 根据证据回答;
- 必要时承认无法确定。
输入是研究问题,输出是包含结论、证据、局限和下一步的回答。
中间是要调用外部工具来做输出的,而不是直接依赖模型训练的过程

概括为:
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;
- 幻觉与证据边界;
- 模型与供应商解耦。