1. 项目概述:从RAG到智能体搜索与知识图谱的演进之路
去年这个时候,我们团队还在为RAG(检索增强生成)系统的召回率与幻觉问题头疼不已。传统的“向量检索+LLM生成”范式,在处理复杂、多跳的专业技术问题时,常常显得力不从心。用户的一个看似简单的提问,背后可能涉及多个概念、版本依赖和最佳实践的串联,而单纯的语义相似度匹配很难捕捉这种深层逻辑。于是,我们启动了一个代号为“探路者”的内部项目,目标是将经典的RAG架构,升级为融合了Agentic Search(智能体搜索)与Tech Graph(技术知识图谱)的新一代问答系统。经过近一年的迭代,在2026年4月25日这个节点,系统核心指标达到了预期:复杂问题解答准确率提升了35%,回答的可解释性显著增强。这不是一篇理论探讨,而是一次完整的、踩过无数坑的落地复盘,我会详细拆解我们为什么这么做、具体怎么做的,以及那些在文档里找不到的实战经验。
简单来说,我们构建的系统不再是一个被动的“检索-应答”机器,而是一个具备一定规划、推理和工具调用能力的“智能体”。它面对用户问题时,会先尝试理解其背后的技术意图,然后利用我们精心构建的技术知识图谱进行逻辑推理和路径规划,最后再调用包括向量检索在内的多种工具来搜集证据,生成最终答案。整个过程,更像是有一个经验丰富的技术专家在背后帮你梳理问题、查阅资料并综合给出建议。接下来,我将从设计思路、核心组件实现、工程化挑战以及效果评估四个维度,完整还原这次升级之旅。
2. 核心架构设计与思路演进
2.1 为何要超越传统RAG?
传统RAG的瓶颈,在应对企业级技术知识库时暴露无遗。我们的知识库包含大量的API文档、架构设计稿、故障排查记录和内部技术博客。一个典型的多跳问题比如:“我们的微服务在Kubernetes 1.27版本上,使用Envoy作为边车代理时,出现‘503 UC’错误,可能的原因和排查步骤是什么?” 传统RAG流程可能是:将问题向量化,去向量数据库召回Top-K个相关片段(可能是关于K8s 1.27的发布说明、Envoy的配置手册、某个服务503错误的日志片段),然后交给LLM去“拼凑”答案。
这里存在几个核心问题:
- 语义鸿沟:“503 UC”是Envoy特有的错误码(Upstream Connection Termination),但问题描述中“微服务”、“Kubernetes”的语义权重可能更高,导致召回的相关片段根本不包含这个关键错误码的解释。
- 逻辑断裂:即使召回了关于Envoy错误码、K8s网络策略、服务健康检查的片段,LLM也需要极强的推理能力才能将这些点串联成一条完整的排查链路:从错误码定位到上游连接问题,联想到可能是Pod生命周期管理导致连接中断,再关联到K8s的
preStop钩子与Envoydrain_time的配置协同问题。这超出了单纯文本生成的范畴。 - 知识静态化:RAG的知识存储在扁平的向量空间中,概念与概念之间的关系(如“Envoy”是“服务网格”的一种“实现”,“Istio”是“基于”Envoy的)无法被显式地利用。这种关系对于理解技术栈和进行推理至关重要。
我们的结论是:需要引入规划和推理能力来指导检索,并引入结构化知识来增强语义理解。这就是Agentic Search和Tech Graph的用武之地。
2.2 Agentic Search + Tech Graph 架构总览
我们设计的核心架构如下图所示(此处为描述,实际落地为代码与配置):
整个系统以智能体(Agent)为调度核心。其工作流可以概括为“规划-执行-反思”的循环:
- 任务规划与分解:智能体接收到用户查询后,首先利用LLM进行意图识别和任务分解。例如,将上述复杂问题分解为子任务:a) 理解“503 UC”错误码的定义;b) 查找Envoy在K8s环境中的常见配置;c) 分析K8s Pod生命周期与网络连接管理的关联;d) 综合以上信息形成排查清单。
- 工具调用与知识检索:智能体拥有一个工具包(Toolkit)。每个子任务会触发一个或多个工具的调用。我们的工具不仅包括传统的向量检索工具(面向非结构化文档),更重要的是新增了:
- 图谱查询工具:将自然语言子任务转换为Cypher查询语句,从Neo4j图数据库中查询实体、关系及路径。例如,查询“
(envoy:ErrorCode {code:'503 UC'})<-[:HAS_ERROR_CODE]-(envoy:Proxy)<-[:USES]-(service:Microservice)”来快速定位该错误码所属的组件及关联服务。 - API调用工具:对于需要实时信息的查询(如某个服务当前状态、最新版本号),智能体可以调用内部API。
- 代码执行工具(受限环境):对于可公式化的计算或数据转换,可安全执行。
- 图谱查询工具:将自然语言子任务转换为Cypher查询语句,从Neo4j图数据库中查询实体、关系及路径。例如,查询“
- 信息融合与答案生成:智能体收集来自各工具的证据(来自向量的文本片段、来自图谱的结构化信息、来自API的实时数据),进行去重、冲突消解和重要性排序,最后交由LLM生成最终答案,并要求其引用证据来源。
- 反思与验证(可选但重要):对于高置信度较低或内部逻辑复杂的回答,系统可以启动一个“反思”步骤,让另一个LLM实例或规则引擎对推理链条和证据进行校验,必要时触发新一轮的规划与检索。
Tech Graph(技术知识图谱)是这一切的基石。我们构建的图谱以“技术栈”为核心,包含了以下类型的实体和关系:
- 实体:技术组件(如
Kubernetes,Envoy,PostgreSQL)、概念(如Service Mesh,CI/CD)、版本号、错误码、团队、文档、故障单。 - 关系:
DEPENDS_ON(依赖)、IS_A(属于,如EnvoyIS_AProxy)、HAS_VERSION、HAS_ERROR_CODE、RELATED_DOCUMENT、CAUSED_BY(故障原因)、RESOLVED_BY(解决方案)。 这个图谱不仅用于检索阶段的精准查询,更在智能体规划阶段提供了关键的“常识”和“逻辑链路”,使其知道该问什么、往哪个方向推理。
3. 核心组件实现与关键技术细节
3.1 技术知识图谱的构建与维护
构建图谱是整个项目最耗时但收益最大的部分。我们放弃了“毕其功于一役”的想法,采用了迭代构建、持续运营的策略。
3.1.1 数据源与实体关系抽取数据源主要分为三类:
- 结构化/半结构化数据:CMDB(配置管理数据库)、Git仓库中的
README.md和docker-compose.yml、API规格说明(OpenAPI/Swagger)。这些数据可以通过规则和模板(如Jinja2)较为容易地转换为图谱节点和边。 - 非结构化文档:Confluence技术文档、故障复盘报告、会议纪要。这是难点所在。我们采用了“分阶段NER(命名实体识别)与RE(关系抽取)”管道:
- 阶段一:粗粒度抽取。使用经过微调的NER模型(基于BERT架构),识别文档中的技术名词(如“Kubernetes 1.27”、“Envoy”、“503 UC”)、版本号、团队名称等。
- 阶段二:关系分类。对于共现在同一段落或相邻句子的实体对,使用一个关系分类模型判断其关系类型。我们定义了约20种核心关系类型。训练数据来自我们对历史文档的人工标注。
- 阶段三:LLM辅助校验与补全。将前两阶段的结果和原文片段一起送入LLM(如Qwen-72B),以“给定实体A和B,以及上下文,它们最可能的关系是什么?”的形式进行校验和补全,显著提升了准确率。
注意:完全依赖LLM进行端到端的抽取在初期成本高且不稳定。我们的“传统模型粗筛+LLM精修”模式,在成本、速度和准确性上取得了较好平衡。同时,我们建立了一个简单的标注平台,将LLM抽取结果和低置信度结果交由内部专家快速校验,这些数据又反过来用于微调我们的NER和RE模型,形成正向循环。
3.1.2 图谱存储与查询我们选择Neo4j作为图数据库。它的Cypher查询语言直观,且对路径查询非常高效。例如,要找到导致“服务A延迟增高”的所有可能基础设施因素,可以查询:
MATCH p=(service:Service {name:'A'})-[:DEPLOYED_ON]->(node:Node)-[:RUNS_ON]->(host:Host)-[:HAS_ISSUE*..3]->(issue:Issue) WHERE issue.type IN ['NetworkCongestion', 'DiskIO', 'CPUThrottling'] RETURN p为了与智能体框架集成,我们封装了一个GraphQueryTool。这个工具接收自然语言描述,由一个专门的LLM(我们称为“Cypher翻译器”)将其转换为Cypher查询。为了防止恶意或错误的查询,我们对生成的Cypher语句进行了严格的模式校验和权限控制(例如,禁止DELETE操作)。
3.2 智能体(Agent)的工程化实现
我们没有从头造轮子,而是基于LangChain和LangGraph框架进行构建。LangGraph的“状态图”概念非常适合描述我们“规划-执行-反思”的循环。
3.2.1 智能体状态设计我们定义了一个核心的AgentState字典,贯穿整个工作流:
from typing import TypedDict, List, Annotated import operator class AgentState(TypedDict): question: str # 原始问题 plan: List[str] # 分解后的子任务列表 findings: Annotated[List[str], operator.add] # 收集到的证据(来自各个工具) intermediate_steps: List[tuple] # (工具调用, 观察结果) 的历史记录 final_answer: str # 最终答案Annotated用于定义findings的合并方式(这里用operator.add即列表追加),这是LangGraph实现并行或循环的关键。
3.2.2 关键节点(Node)实现
- 规划节点(Plan Node):使用一个LLM(我们选用
Qwen2.5-72B-Instruct)作为规划器。提示词(Prompt)的核心是要求模型将复杂问题分解为可被具体工具执行的子任务,并明确每个子任务的目标和可能需要的工具类型。我们提供了工具的名称和描述作为上下文。 - 工具执行节点(Execute Node):这是一个多路分发器。根据子任务描述,一个路由LLM(轻量级模型即可)会决定调用哪个工具。工具执行后,结果被格式化并添加到
state['findings']中。 - 重排序与融合节点(Rerank & Fusion Node):当所有规划的子任务执行完毕,或执行轮次达到上限时,进入此节点。这里我们引入了交叉编码器(Cross-Encoder)进行重排序。我们将用户原始问题与每一条收集到的
finding进行两两匹配打分(使用BAAI/bge-reranker-v2-m3模型),筛选出最相关的几条证据。这比单纯依赖向量检索的初次召回更精准。 - 回答生成节点(Answer Node):将重排序后的顶级证据和原始问题一起,发送给LLM生成最终答案,并要求以引用的形式注明证据来源(例如,
[来自图谱:Envoy配置文档],[来自向量库:故障报告#123])。
3.2.3 编排与循环控制使用LangGraph的StateGraph来编排节点。边(Edge)的条件决定了流程走向。我们的主流程是:Plan -> Execute -> [检查是否完成所有计划或达到最大步骤] -> 若否,则回到Plan进行下一步或调整计划;若是,则进入Rerank & Fusion -> Answer。这个循环控制逻辑写在图的边条件判断中,实现了动态的任务执行。
3.3 混合检索系统的优化
尽管引入了图谱,向量检索对于非结构化的细节描述、长篇案例依然不可替代。我们构建了一个混合检索管道:
- 多路召回:
- 向量检索路:使用
BAAI/bge-large-zh-v1.5模型将文档切片编码,存入Chroma向量库。针对查询进行语义召回。 - 关键词检索路:使用Elasticsearch,对文档进行BM25算法检索,保证关键术语的精确匹配。
- 图谱检索路:通过
GraphQueryTool获得的结构化信息,可以转化为文本片段(如“实体A与实体B存在依赖关系”),也作为一路召回结果。
- 向量检索路:使用
- 融合与重排序:
- 初期采用简单的加权求和(如向量分0.7 + BM25分0.3)进行融合。
- 更优的方案是使用学习排序(Learning to Rank, LTR)模型,我们将多路召回的结果(包括各路的原始分数、片段长度、来源类型等作为特征)进行标注,训练一个梯度提升树模型(如LightGBM)来进行最终排序。这是提升效果最明显的一步。
- 最后,再经过前述的交叉编码器重排序,确保交给LLM的证据是最精炼、最相关的。
4. 落地过程中的挑战与解决方案
4.1 知识图谱的冷启动与数据质量
挑战:项目初期,图谱数据稀疏,无法支撑有效的查询。从非结构化文档自动抽取的实体和关系噪声大。
解决方案:
- “面包屑”启动法:我们不追求大而全,而是从最高频、最核心的“痛点”问题域开始。例如,我们首先围绕“部署”和“故障”两个场景,人工构建了约50个核心实体(如
Service,Pod,Cluster,ErrorCode)和它们之间的关系。这构成了一个微型的、但高度可用的子图。 - 构建反馈闭环:在系统早期,每次智能体使用图谱查询工具后,我们会记录查询和返回结果。如果结果为空或明显不相关,这个案例会进入一个待审核队列,由工程师手动检查是否需要补充图谱数据。这相当于让用户(智能体)帮助我们标注了数据缺口。
- 实施严格的数据质量管道:所有自动抽取的结果,都必须经过一个基于规则和轻量级模型的过滤器。例如,关系
DEPENDS_ON的两个实体必须都是技术组件;版本号必须符合正则模式。我们设立了“置信度”阈值,低于阈值的数据进入人工审核流程,而非直接入库。
4.2 智能体的规划幻觉与失控循环
挑战:LLM作为规划器,有时会生成不切实际或无限循环的子任务(例如,“去查询一个不存在的系统状态”)。
解决方案:
- 工具描述的精雕细琢:我们发现,规划的质量极度依赖工具描述的清晰度和约束条件。我们将工具描述从“查询数据库”改为“根据实体名称,查询其在技术知识图谱中的直接关联实体和关系。输入应为明确的技术名词。” 并提供了几个示例。
- 引入验证节点:在规划节点之后,增加一个“计划验证”节点。这个节点使用一组规则和另一个轻量级LLM,对生成的子任务列表进行校验:任务是否清晰?是否有对应工具?是否可能陷入循环(通过检查与历史步骤的相似度)?如果校验不通过,则要求规划器重新生成。
- 设置硬性边界:严格限制最大执行轮次(如5轮)。在状态中维护一个已执行步骤的摘要,每次规划时都将其作为输入,避免重复劳动。
4.3 系统性能与延迟
挑战:智能体的多步推理、多次LLM调用和检索,导致端到端响应时间从传统RAG的秒级增长到十秒甚至数十秒级,用户体验差。
解决方案:
- 异步化与流式响应:将智能体的“思考”过程异步化。当用户提交复杂问题后,立即返回一个“正在分析”的提示,同时在后端执行工作流。对于最终答案,采用流式(SSE)返回,让用户先看到部分结论。
- 缓存策略:
- 结果缓存:对最终答案进行缓存(基于问题指纹)。但更有效的是对中间步骤进行缓存。例如,将“规划结果”、“图谱查询结果”进行缓存。当类似问题出现时,可以直接复用规划或某个工具的结果,跳过耗时的LLM调用。
- 向量索引缓存:对常见的查询进行向量检索结果的缓存。
- 模型分级:并非所有步骤都需要大模型。我们进行了分级:规划、最终答案生成使用
Qwen2.5-72B(能力强);工具路由、Cypher翻译、反思验证使用Qwen2.5-7B或更小的模型(速度快)。重排序模型使用专用的高效交叉编码器。 - 并行工具调用:在LangGraph中,可以设计让多个独立的工具调用并行执行。例如,分解出的子任务如果互不依赖,可以同时调用向量检索和图谱查询工具,大幅缩短等待时间。
4.4 评估与持续改进
挑战:如何量化新系统比旧RAG好?如何持续发现不足?
解决方案:
- 构建基准测试集:我们从历史客服工单、内部技术问答群中,筛选出200个具有代表性的多跳、复杂技术问题,并请专家撰写了标准答案和关键证据点。这成为我们的黄金测试集。
- 多维度评估指标:
- 答案相关性(Answer Relevance):使用LLM-as-a-Judge(让GPT-4/Qwen-Max作为裁判),对比生成答案与标准答案的一致性。
- 证据召回率(Evidence Recall):检查标准答案中提到的关键证据点,有多少被系统在检索环节成功召回。
- 推理链可解释性:这是一个主观但重要的指标。我们要求智能体在最终答案外,输出其“思考过程”的简化版(用了哪些工具,查询了什么,找到了什么),由人工评估其逻辑是否合理。
- 延迟与成本:监控平均响应时间和每次查询的Token消耗。
- A/B测试与影子模式:在完全切换前,我们将新系统以“影子模式”运行,即同时处理线上流量但不返回结果给用户,只记录其输出并与旧系统结果对比分析。随后进行小流量A/B测试,用真实的用户满意度(如“是否有用”打分)来验证。
5. 效果复盘与未来展望
经过上述努力,在2026年Q1的评估中,新系统在黄金测试集上的表现如下:
- 复杂问题解答准确率:从传统RAG的58%提升至78%(基于LLM裁判评分)。
- 证据召回率:提升了40%,尤其是在需要多跳推理的问题上。
- 平均响应时间:从最初的12秒优化至4.5秒(对于复杂问题),简单问题可在2秒内响应。
- 工程师反馈:最大的好评来自于答案的“可解释性”。智能体提供的“思考过程”让用户,尤其是新手,能够理解答案是如何得出的,甚至能顺着提供的线索自己去查阅相关文档,起到了教学作用。
我个人在实际操作中最深的几点体会是:
第一,不要指望LLM解决所有问题。它更像是一个强大的“胶水”和“推理引擎”,但需要扎实的“基础设施”——高质量的知识图谱、精准的检索工具、清晰的任务规划规范。这些基础设施的构建,需要大量的领域知识和工程工作,无法被大模型替代。
第二,迭代思维至关重要。我们不是一次性设计出完美架构,而是从一个能跑通的简单闭环开始(比如,先实现基于图谱的简单QA,再接入智能体做单步规划,最后实现多步循环)。每增加一个组件,都紧密评估其效果和成本。
第三,评估体系是导航仪。没有好的评估,优化就失去了方向。除了自动化的指标,定期的人工Case Review必不可少。我们每周会随机抽查20个回答,分析bad case,这往往是发现系统深层缺陷或知识缺口的最好方式。
关于未来,我们正在探索几个方向:一是让图谱更加“动态”,能够自动从线上故障、代码提交日志中学习新的实体和关系;二是探索多智能体协作,让不同类型的智能体(如一个负责诊断,一个负责给出解决方案)共同解决超复杂问题;三是进一步优化成本,研究更高效的模型调度策略和缓存机制。
这条路没有终点,但看到系统能像一个不知疲倦的资深专家一样,帮助团队快速定位和解决问题,所有的投入都是值得的。希望我们踩过的这些坑和总结的经验,能为同样在探索RAG进阶之路的团队提供一些切实的参考。