1. 从一份日报标题里,我看到了 Agent 与 LLM 落地的真实水位
先把这份日报的标题拆开看:Agent、LLM、RAG、GraphRAG、MCP。这五个词放在一起,基本就是当下大模型工程化落地的完整链路——模型是底座,RAG 是外挂记忆,GraphRAG 是记忆的结构化升级,MCP 是工具调用的标准化接口,Agent 是把这些串起来干活的执行体。任何一个做 AI 应用的人,绕不开这五个词。
我平时会习惯性地把这类日报当成一个"行业温度计"来读。单看某一条技术新闻没什么感觉,但把一周、一个月的条目横向拉通,就能看出哪些方向在真正沉淀、哪些还停留在概念炒作。这份 2026-09-28 的日报里,热搜词覆盖了从agent安全、ai agent 怎么扛并发到rag知识库能存储图片嘛、ontology rag这种非常具体的问题,说明行业已经从"Agent 是什么"过渡到了"Agent 怎么扛住生产环境"的阶段。
这篇文章我想做的事情很明确:把这份日报背后的技术脉络完整拆一遍,讲清楚每个方向的核心原理、当前的真实瓶颈、以及我自己在实操中踩过的坑和验证过的方案。适合正在做 AI 应用落地的工程师、技术负责人,也适合刚入门想搞清楚这些概念到底怎么串起来的朋友。我不会只讲概念,每个部分都会落到"具体怎么做、为什么这么做、哪里容易翻车"。
2. Agent 与 LLM 的底层关系:别把执行体和模型混为一谈
2.1 LLM 是大脑,Agent 是带着手脚和记忆的人
很多人一开始会把 Agent 和 LLM 当成一回事,这是个典型的认知误区。LLM 本质上是一个无状态的函数:你给它一段输入(prompt),它返回一段输出(completion)。它没有记忆,没有手脚,不能主动做任何事。你问它今天天气,它只能根据训练数据里的统计规律编一个,因为它没法真的去查。
Agent 则是在 LLM 外面套了一整套工程结构:规划(Planning)、记忆(Memory)、工具调用(Tool Use)、执行循环(Loop)。用生活化的类比,LLM 是一个知识渊博但被关在房间里的人,Agent 是给这个人配了电话(工具调用)、笔记本(记忆)、以及一套"先想再做、做完检查"的工作习惯(规划与循环)。
这个区别决定了工程上的所有取舍。LLM 的调用是无状态的、幂等的、可缓存的;Agent 的执行是有状态的、可能产生副作用的、难以简单重放的。你在设计系统时如果没意识到这一点,后面一定会出问题。
2.2 从单次调用到自主循环,复杂度是怎么爆炸的
一个最简单的 Agent 循环长这样:
while not task_done: thought = llm.think(context) # 规划 action = llm.decide_action(thought) # 决策 result = execute_tool(action) # 执行 context.append(result) # 记忆更新看起来很简单,但复杂度在几个维度上同时爆炸。第一,循环次数不可控。LLM 可能陷入死循环,反复调用同一个工具。第二,错误会累积。第一步工具返回了错误结果,第二步基于错误结果继续推理,越走越偏。第三,上下文会膨胀。每一轮的结果都塞进 context,很快就超出模型的上下文窗口。第四,副作用不可逆。如果 Agent 调用了"发送邮件"或"删除文件"这类工具,出错就是真出错。
这就是为什么热搜里会出现识的llm智能体自主容错控制:构建可靠ai系统的工程实践这样的词条。容错不是锦上添花,是 Agent 能不能上生产的前提。我自己的经验是,任何 Agent 系统在设计阶段就要把"失败路径"当成一等公民来设计,而不是等它跑挂了再补。
2.3 主流 Agent 框架的选型逻辑
热搜里出现了agent框架、llm框架、agent架构这些词,说明大家在纠结选型。我的判断逻辑是这样的:
| 框架类型 | 代表特征 | 适合场景 | 主要代价 |
|---|---|---|---|
| 轻量编排型 | 代码即流程,显式控制 | 流程固定的业务自动化 | 灵活性低,复杂决策吃力 |
| 通用 Agent 型 | 自主规划+工具循环 | 开放式任务、研究型 | 不可控、调试难、成本高 |
| 图结构编排型 | 节点+边+状态机 | 多步骤、需人工介入 | 学习曲线陡 |
| 多智能体型 | 多个角色协作 | 复杂分工任务 | 通信开销大、易发散 |
选型的核心不是"哪个最强",而是"你的任务有多确定"。任务越确定,越应该用显式编排,把 LLM 限制在它擅长的局部(比如意图识别、内容生成);任务越开放,才越需要自主 Agent。我见过太多团队一上来就上全自主 Agent,结果一个本该三步搞定的流程,Agent 跑了二十步还跑偏,成本和延迟都爆炸。
提示:判断要不要用自主 Agent,问自己一个问题——这个任务的执行路径,我能不能提前画出来?能画出来就别用自主 Agent,用工作流。
3. RAG 的真实瓶颈:检索增强到底卡在哪
3.1 RAG 的基本链路与它解决的问题
RAG(Retrieval-Augmented Generation,检索增强生成)解决的是 LLM 的两个硬伤:知识过时和幻觉。基本链路是:用户提问 → 检索相关文档片段 → 把片段塞进 prompt → LLM 基于片段生成答案。
def rag_query(question): query_vec = embed(question) docs = vector_db.search(query_vec, top_k=5) context = "\n".join([d.text for d in docs]) prompt = f"基于以下资料回答问题:\n{context}\n\n问题:{question}" return llm.generate(prompt)看起来也不复杂,但热搜里rag瓶颈、rag检索增强、rag实战这些词说明,真正落地时问题一大堆。
3.2 检索质量才是真正的天花板
我踩过最大的坑就是:以为 RAG 的效果取决于模型,其实取决于检索。检索没召回对的文档,再强的模型也只能瞎编。检索的瓶颈又分几层:
第一层是切分(Chunking)。文档切得太碎,语义不完整;切得太大,噪声多、检索不准。我一般用 300-500 token 的块,加 10%-20% 的重叠,但这不是铁律,得看文档类型。技术文档适合按标题层级切,对话记录适合按轮次切。
第二层是向量化的语义鸿沟。用户问"怎么退款",文档里写的是"申请售后流程",字面不重合,纯向量检索可能召不回。这时候需要混合检索(向量+关键词 BM25),或者加一层查询改写。
第三层是排序(Rerank)。向量检索的 top-k 里往往混着不相关的,用一个 cross-encoder 做精排能显著提升。实测下来,加 rerank 通常比换更强的 embedding 模型性价比更高。
3.3 图片、表格、结构化数据怎么进 RAG
热搜里rag知识库能存储图片嘛是个高频问题。答案是能,但方式有讲究。纯文本 RAG 存不了图片的语义,常见做法有三种:
- 图片转文字:用多模态模型给图片生成描述,把描述存进向量库。简单,但会丢细节。
- 多模态向量:用 CLIP 这类模型把图片和文本映射到同一向量空间,支持图文互搜。效果好,但工程复杂。
- 图文关联存储:文本块里保留图片引用,检索到文本时把图片一起返回给多模态模型。这是目前最实用的方案。
表格和结构化数据更麻烦。直接转文本会丢结构,我的做法是把表格转成 Markdown 或 JSON 保留结构,同时生成一段自然语言摘要用于检索,检索命中后返回原始结构化数据。
3.4 RAG 与知识库的边界:wiki、KG、RAG 到底怎么选
热搜里wiki和rag、kg知识库、rag知识库和结构知识库区分以及应用场景这几个词很值得聊。很多人把这三个混为一谈,其实它们的定位完全不同:
| 类型 | 存储形式 | 擅长 | 不擅长 |
|---|---|---|---|
| Wiki | 人工维护的文档 | 稳定知识、流程规范 | 动态查询、推理 |
| RAG 知识库 | 向量化的非结构化文本 | 语义检索、开放问答 | 精确关系推理 |
| 知识图谱 KG | 实体-关系三元组 | 多跳推理、关系查询 | 模糊语义、长文本 |
实际项目里我很少只用一种。常见组合是:RAG 负责语义召回,KG 负责关系推理,Wiki 作为权威源。比如问"张三的直属领导负责哪个项目",纯 RAG 很难答对,因为需要多跳关系;但 KG 能直接查出来。反过来问"这个项目的背景是什么",KG 就无能为力,得靠 RAG。
4. GraphRAG 与 Ontology RAG:当检索遇上图结构
4.1 为什么普通 RAG 搞不定"全局性问题"
普通 RAG 有个致命弱点:它只能回答局部问题。你问"这份文档里提到的某个具体参数是多少",它能答;但你问"这份文档整体讲了哪几个主题,它们之间什么关系",它就抓瞎了。因为向量检索是拿 query 去匹配局部片段,它天然看不到全局结构。
GraphRAG 就是冲着这个问题来的。它的核心思路是:先用 LLM 从文档里抽取实体和关系,构建知识图谱,再基于图做社区检测和摘要。查询时,既能走局部检索(找具体实体),也能走全局检索(找主题社区)。
4.2 GraphRAG 的构建流程与代价
构建流程大致是:
- 实体与关系抽取:让 LLM 逐块读文档,抽出实体、关系、以及每个实体的描述。
- 图构建:把实体作为节点,关系作为边,合并重复实体。
- 社区检测:用 Leiden 等算法把图划分成若干社区(cluster)。
- 社区摘要:让 LLM 给每个社区生成摘要,形成层次化的主题结构。
- 查询:局部查询走实体邻域,全局查询走社区摘要。
代价很实在:构建成本高。一份几百页的文档,抽取阶段可能要调用几千次 LLM,token 消耗是普通 RAG 的几十倍。所以我的建议是,只有当你的问题确实需要全局理解和多跳推理时,才上 GraphRAG。如果只是简单的文档问答,普通 RAG 加个好点的 rerank 就够了。
4.3 Ontology RAG:给检索加上"世界观"
热搜里的ontology rag是 GraphRAG 的一个进阶方向。普通 GraphRAG 抽出来的图是"野生"的,实体类型和关系类型都不受控。Ontology RAG 的做法是先定义一个本体(Ontology)——也就是预先规定好有哪些实体类型(人、组织、产品、事件)、哪些关系类型(属于、导致、依赖),然后让抽取过程遵循这个本体。
好处很明显:图更干净、查询更可控、跨文档的一致性更好。坏处是需要领域专家参与设计本体,前期投入大。我的经验是,在垂直领域(医疗、法律、金融)做知识密集型应用时,Ontology RAG 的投入是值得的;通用场景下,野生图谱反而更灵活。
4.4 一个容易忽略的坑:抽取质量决定一切
GraphRAG 的效果几乎完全取决于抽取质量。我见过太多项目,图建得漂漂亮亮,一查全是错的。常见问题包括:实体指代没消解("苹果公司"和"苹果"被当成两个节点)、关系方向搞反、抽取时幻觉编造关系。
我的做法是加一层抽取校验:对高价值的关系,用第二个模型做交叉验证;对实体做归一化(统一大小写、别名映射);定期抽样人工检查。这些看起来是脏活累活,但省不得。
5. MCP 协议:工具调用终于有了统一接口
5.1 MCP 到底解决了什么问题
在 MCP 出现之前,每个 Agent 框架都有自己的工具定义方式。你给 LangChain 写的工具,换到另一个框架就得重写。MCP(Model Context Protocol)的出现,本质上是想给"模型怎么调用外部工具"这件事定一个统一协议,就像 USB 统一了外设接口一样。
热搜里mcp是什么、mcp协议、mcp工具流式输出内容到文件这些词,说明大家既在问概念,也在问实操。MCP 的核心是:服务端(Server)暴露能力(工具、资源、提示模板),客户端(Client,通常是 Agent 宿主)按协议调用。协议基于 JSON-RPC,传输层可以是标准输入输出,也可以是 HTTP。
5.2 MCP 的三种能力原语
MCP 定义了三种服务端能力:
- Tools(工具):可被模型调用的函数,比如查数据库、发请求、写文件。这是用得最多的。
- Resources(资源):可被读取的数据,比如文件内容、数据库记录。偏向"读"。
- Prompts(提示模板):预定义的提示模板,方便复用。
理解这三者的区别很重要。Tools 是"动作",Resources 是"数据",Prompts 是"话术模板"。设计 MCP Server 时,把只读的数据暴露成 Resource,把有副作用的操作暴露成 Tool,这样客户端能更好地做权限控制。
5.3 从零写一个 MCP Server 的关键步骤
以 Python 为例,一个最小可用的 MCP Server 大致结构:
from mcp.server import Server from mcp.types import Tool, TextContent server = Server("my-server") @server.list_tools() async def list_tools(): return [Tool( name="query_db", description="查询数据库", inputSchema={"type": "object", "properties": {"sql": {"type": "string"}}} )] @server.call_tool() async def call_tool(name, arguments): if name == "query_db": result = run_sql(arguments["sql"]) return [TextContent(type="text", text=str(result))]几个实操要点:description 要写清楚,模型靠它决定调不调这个工具;inputSchema 要严格,参数类型错了模型会乱填;错误要返回结构化信息,别直接抛异常,否则模型不知道发生了什么。
5.4 MCP 生态里的真实问题
热搜里出现了ida mcp下载、x32dbg 的mcp插件、altium designer ai接口 mcp、unreal 5.8 mcp这些词,说明 MCP 正在往各种专业软件里渗透。这是好事,但也带来新问题:
第一,安全边界模糊。一个能操作你本地文件的 MCP Server,如果被恶意 prompt 诱导,可能干坏事。这就是agent安全、agentpoison这类词条出现的原因。我的建议是,MCP Server 一定要做权限最小化,能只读就别给写权限。
第二,工具太多反而降低效果。给模型塞几十个工具,它会选错。实践中我一般控制在 10 个以内,超过就做分组或路由。
第三,流式输出与工具调用的冲突。热搜里使用mcp工具流式输出内容到文件反映的就是这个。工具调用通常是"一次性返回结果",而流式输出是"边生成边推"。两者结合时要注意缓冲和顺序,否则会出现内容错乱。
6. Agent 上生产的硬骨头:并发、安全与容错
6.1 AI Agent 怎么扛并发
热搜里ai agent 怎么扛并发是个非常现实的问题。Agent 的并发难点和普通 Web 服务不一样:
- 单次请求耗时长:一个 Agent 任务可能跑几十秒到几分钟,占着连接不放。
- LLM 调用有速率限制:上游 API 通常有 QPS 和 TPM 限制,并发一高就被限流。
- 状态管理复杂:每个 Agent 会话有独立状态,不能简单无状态扩展。
我的方案是异步任务队列 + 状态外置。用户请求进来先入队,返回一个 task_id;后台 worker 池消费任务,把 Agent 状态存到 Redis 或数据库;用户通过 task_id 轮询或订阅结果。这样既能削峰,又能水平扩展 worker。LLM 调用层再加一层令牌桶限流和重试退避,避免被上游打挂。
6.2 Agent 安全:被投毒的记忆有多可怕
agentpoison: red-teaming llm agents via poisoning memory or knowledge ba这个词条点出了一个被低估的风险:Agent 的记忆和知识库是可以被投毒的。攻击者只要往知识库里塞几条精心构造的内容,Agent 在检索时就会召回这些内容,从而被诱导做出错误决策。
防御思路有几层:输入侧做内容审核和来源标记,低可信来源的内容降权;检索侧做异常检测,识别突然出现的高频异常内容;输出侧做动作校验,高危操作(转账、删除)强制人工确认。我个人的原则是,任何有副作用的 Agent 动作,都要有独立的权限校验,不能只依赖模型的判断。
6.3 容错控制:让 Agent 自己知道错了
回到识的llm智能体自主容错控制这个词。Agent 容错的核心是让系统能识别自己的失败。常见手段包括:
- 结果校验:工具返回后,用一个轻量模型或规则检查结果是否合理。
- 循环检测:记录已执行的动作,发现重复就中断。
- 预算控制:限制最大步数、最大 token、最大耗时,超了就优雅退出。
- 回滚机制:对有副作用的操作,设计可回滚的方案(比如先写草稿再提交)。
我踩过最深的坑是没有预算控制。一个 Agent 因为工具一直返回空结果,硬是循环了上百次,烧掉了一大笔 token 费用。从那以后,我给每个 Agent 都设了硬性预算上限,这是保命的。
6.4 LLM as Judge:用模型评估模型
热搜里llm as judge是个很实用的模式。当你要评估 Agent 的输出质量时,人工标注太慢,规则又太死,用另一个 LLM 来打分是个折中方案。
def judge(question, answer, reference): prompt = f"""请评估以下回答的质量,从准确性、完整性、相关性三个维度打分(1-5)。 问题:{question} 参考答案:{reference} 待评估回答:{answer} 请输出 JSON 格式的评分和理由。""" return llm.generate(prompt)实操要点:judge 模型最好比被评估模型更强,否则评不准;评分标准要写死,否则每次打分尺度不一致;要防位置偏见,对比两个答案时交换顺序各评一次。LLM as Judge 不是万能的,但作为自动化回归测试的一环,性价比很高。
7. 常见问题速查与避坑清单
7.1 高频问题速查表
| 问题 | 根因 | 解决方向 |
|---|---|---|
| RAG 答非所问 | 检索召回不准 | 加 rerank、混合检索、查询改写 |
| Agent 死循环 | 无预算控制、无循环检测 | 设最大步数、记录动作历史 |
| 工具调用报 schema 错误 | 参数定义不严 | 严格 inputSchema、加参数校验 |
| 上下文超限 | 记忆无压缩 | 摘要压缩、滑动窗口、外置记忆 |
| 并发上不去 | 同步阻塞、无队列 | 异步队列、状态外置、限流 |
| 知识库被投毒 | 无来源校验 | 来源标记、异常检测、动作校验 |
| GraphRAG 成本高 | 抽取调用过多 | 增量构建、缓存、按需抽取 |
7.2 我踩过的几个真实坑
第一个坑是过度依赖向量检索。早期我做的 RAG 系统,用户问精确的编号、型号,向量检索经常召不回,因为数字的语义向量区分度很低。后来加了 BM25 混合检索,这类问题立刻好转。凡是涉及精确匹配的场景,关键词检索永远不能丢。
第二个坑是把 Agent 的思考过程当黑盒。Agent 跑偏的时候,如果不记录每一步的 thought 和 action,根本没法调试。我现在强制要求所有 Agent 都打详细日志,包括每轮的输入、输出、工具调用参数和结果。这些日志在排查问题时价值巨大。
第三个坑是MCP 工具描述写得太随意。有一次我写了个工具叫process,描述就一句"处理数据",结果模型几乎从不调用它,因为它不知道这工具干嘛的。后来改成extract_invoice_fields,描述写清楚输入输出,调用率立刻上来了。工具的名字和描述,就是给模型的说明书,马虎不得。
7.3 给不同阶段团队的建议
如果你刚起步,我的建议是先用最朴素的方案跑通闭环:一个 LLM 调用 + 一个简单的向量检索,别一上来就上 GraphRAG 和多智能体。跑通之后,根据真实 badcase 逐个优化,缺什么补什么。
如果你已经在生产环境跑,重点应该放在可观测性和容错上。Agent 系统最怕的不是效果差,而是出问题时你根本不知道哪里错了。日志、追踪、评估集,这三样是生产系统的地基。
如果你在做垂直领域,本体和知识图谱的投入会越来越值钱。通用能力大家都能调 API,真正的壁垒在于你对领域知识的结构化程度。
最后分享一个我最近在用的技巧:给 Agent 加一个"自我反思"步骤。在它准备执行最终动作前,让它用一句话复述"我即将做什么、为什么",很多时候它自己就会发现逻辑不对。这个成本极低,但拦截了不少低级错误。