从 LLM 到 Agent:LangChain、LlamaIndex、Agent 与 Harness
你是否接触过这些概念:LLM、Tool、Agent、Agent Loop、Harness、LangChain、LangGraph、LlamaIndex
繁多的概念令我产生一个疑问:
既然已经有 Claude Code、Codex 这样的成熟 Agent,所谓“开发 Agent”到底是在开发什么?难道是重新开发一套 Harness?
经过梳理之后,我终于有了些眉目,现在让我们从一个最基本的 Agent 执行过程开始理解。
什么是 Agent?
1. 从 LLM 到 Agent
以下是最基本的 LLM 调用范式:
User
↓
LLM
↓
Answer
用户提出问题,LLM 根据上下文生成答案,结束。
Agent 与 LLM 的关键区别在于:Agent 不只是生成最终答案,还可以决定下一步应该采取什么行动。
例如用户要求:
分析某个目标的基本 Web 服务情况,并生成报告。
Agent 的执行过程可能如下:
User
↓
LLM
↓
决定调用 DNS Tool
↓
DNS Result
↓
LLM
↓
决定调用 HTTP Tool
↓
HTTP Result
↓
LLM
↓
决定调用其他分析 Tool
↓
Result
↓
LLM
↓
Final Answer
因此可以暂时把 Agent 理解为:
一个能够根据任务和反馈,反复决定“下一步做什么”,直到得出最终结果的 LLM 系统。
2. Tool:“说”到“做”
LLM 本身不具备执行程序的能力,例如模型生成:
{
"tool": "dns_lookup",
"arguments": {
"domain": "example.com"
}
}
这并不意味着模型真的进行了 DNS 查询,这只是 token 序列的解析结果。
它表达了一种意图:
我希望调用
dns_lookup()。
如果想要真正调用 dns_lookup(),则需要依靠外部工具。
因此:
LLM
│
│ Tool Call
▼
Harness / Runtime
│
▼
Tool
│
▼
Real World
这样就实现了 LLM 与现实世界的交互。
Tool Call 可以是很多东西比如:
read_file()
write_file()
run_shell()
search_web()
query_database()
search_document()
call_api()
于是 Claude Code、Codex 等 Agent 不只是“聊天机器人”,它们拥有可以实际操作开发环境的工具,真正参与进了执行流程。
3. Agent Loop:永不停止…直到
如果 LLM 调用一次 Tool 就结束,那与想要喝水但是只走了一步的人没有区别。
为了让 LLM 达到目标,我们必须让他思考当前的调用结果,除非目标达成,否则进行下一的轮思考与调用。
类似:
Think
↓
Act
↓
Observe
↓
Think
↓
Act
↓
Observe
↓
...
↓
Finish
对应到程序逻辑,可以极度简化为:
while True:
response = llm(messages)
if response.tool_call:
result = execute_tool(response.tool_call)
messages.append(result)
else:
return response
例如:
用户:修复这个 Bug
↓
LLM:先读取文件
↓
read_file()
↓
LLM:发现问题,修改代码
↓
write_file()
↓
LLM:运行测试
↓
run_test()
↓
测试失败
↓
LLM:重新分析
↓
write_file()
↓
run_test()
↓
测试通过
↓
Final Answer
这个不断进行:
思考 → 行动 → 获取结果 → 再思考
的机制,就是最基本的 Agent Loop。
4. Harness:让 Agent 真正运行起来的环境
这时出现一个问题:
谁负责:
- 调用 LLM?
- 保存上下文?
- 执行 Tool?
- 保存 Tool Result?
- 再次调用 LLM?
- 控制 Agent Loop?
- 限制危险操作?
- 管理 Token?
- 保存状态?
- 记录日志?
- 处理失败和重试?
这些都不能单纯依赖 LLM。
将 LLM 作为整个任务的思考中枢,为其提供工具调用、上下文管理、对话记忆等等环境的外部运行系统,我们将其称之为 Harness:
┌──────────────────────────────┐
│ Harness │
│ │
│ Model API │
│ Context Management │
│ Agent Loop │
│ Tool Execution │
│ State / Memory │
│ Permission │
│ Sandbox │
│ Error Handling │
│ Logging / Observability │
│ │
└──────────────┬───────────────┘
│
▼
LLM
看一个简单易懂的类比:
| 概念 | 类比 |
|---|---|
| LLM | 大脑 |
| Tool | 手里的工具 |
| Agent Loop | “想 → 做 → 看 → 再想”的循环 |
| Harness | 身体 + 工作环境 + 运行系统 |
| Agent | 利用以上能力完成任务的整体智能体 |
Agent 开发?
1. “开发 Agent”不等于“开发 Harness”
所谓 Agent Development 通常并不是从头开发一个 Claude Code 出来,更多时候是在设计:
Agent 的目标
+
System Prompt
+
Tools
+
Workflow
+
State
+
Knowledge
+
Evaluation
例如开发一个 Research Agent:
User
↓
Research Agent
↓
Search
↓
Read
↓
Analyze
↓
发现信息不足
↓
Search Again
↓
Synthesize
↓
Report
或者开发一个 Data Agent:
User Question
↓
Agent
↓
Generate SQL
↓
Execute SQL
↓
Observe Result
↓
Fix SQL
↓
Analyze Data
↓
Answer
这些都属于 Agent 开发,他们关注的是 LLM 下一步的决策方向和工具调用的颗粒度,而不是重新实现一整套底层 Harness。
2. 那为什么已经有 Claude Code / Codex,还需要开发 Agent?
著名的 Claude Code、Codex,他们都是Coding Agent,换言之,他们关注的是让 LLM 在软件工程环境中完成 Coding Task,所以模型在设计上是为了满足编写代码的要求。如果你只是需要让 AI 写代码,那么无论是 CC 还是 Codex,我相信都能满足你的愿望,无需自扰开发一整个 Agent。
如果现在要制定旅游攻略呢?如果现在要根据特定知识完成一个复杂研究呢?尽管上述 Agent 也有很强的通用能力,他们的流程设计上毕竟不是为了完成我们特殊需求而定制的,结果难免差强人意,于是我们就要针对任务开发具备独特流程、工具、数据能力的 Agent。
注意了,现在讨论的都是 Agent 开发,只有当现有 Runtime / Framework 无法满足需求,或者需要非常强的底层控制时,才有必要进一步开发自己的 Harness。
LangChain, LangGraph, LlamaIndex
1. LangChain 是什么?
LangChain 可以理解为:
帮助开发者构建 LLM / Agent 应用的框架。
如果完全自己实现 Agent,需要处理:
调用 Model
↓
解析 Tool Call
↓
执行 Tool
↓
保存 Result
↓
更新 State
↓
再次调用 Model
↓
判断是否结束
LangChain 将其中很多常见模式进行了封装。
因此开发者可以把更多注意力放在:
Agent 要解决什么问题?
↓
需要哪些 Tools?
↓
如何组织 Workflow?
↓
需要什么 Context?
↓
怎样评价结果?
而不是每次重新实现基础设施。
2. LangGraph:当 Agent Loop 变复杂
简单 Agent 可以是:
LLM → Tool → LLM → Tool → LLM
但复杂 Agent 可能出现:
┌→ Search
│
User → Planner ──┼→ Database
│
└→ Knowledge Base
↓
Verify
↓
┌───────┴───────┐
Retry Answer
这时候需要更加明确地管理:
- State
- Node
- Routing
- Retry
- Persistence
- Human-in-the-loop
- Long-running workflow
LangGraph 更接近这一层:
Stateful Agent Runtime / Workflow Orchestration
3. LlamaIndex:让 Agent 使用自己的数据
如果 Agent 需要查询几千份 PDF、Wiki、数据库和内部文档怎么办?
这就是 LlamaIndex 擅长的领域之一。
基本流程:
Documents
↓
Parse / Chunk
↓
Embedding
↓
Index
↓
Retrieval
↓
Relevant Context
↓
LLM
也就是常见的 RAG:
Retrieval-Augmented Generation
4.粗略区分记忆:
LangChain
→ 更偏 Agent / Tool / Application Orchestration
LangGraph
→ 更偏 Stateful Workflow / Agent Runtime
LlamaIndex
→ 更偏 Data / Retrieval / RAG
但三者的实际功能存在明显重叠,不能把这张分类表理解成严格边界。
结语
到此为止,你应该了解了 Agent 的整个流程,知道了什么是 Agent 以及 Agent 开发的概念和基本框架,并且明白了为何我们要在已经存在 CC、Codex 此类 Agent 的情况下,依然选择开发一套 Agent,真正实现了从 LLM 到 Agent 的阶段式跨越。