使用的工具类型

主要使用两类工具:

  1. 语义搜索(Semantic Search)- codebase_search

  • 工具:codebase_search

  • 原理:基于语义理解,而非关键词匹配

  • 特点:能理解代码意图和上下文

  1. 文本搜索(Text Search)- grep

  • 工具:grep(基于 ripgrep)

  • 原理:精确的字符串/正则匹配

  • 特点:快速、精确,但需要知道具体关键词

语义搜索的底层原理

2.1 向量化(Embedding)
 你的问题:"企业规则检索合思知识库"
     ↓
 向量化模型(类似你之前问的RAG)
     ↓
 查询向量:[0.12, -0.45, 0.78, ..., 0.23]

代码库中的每个代码片段也会被向量化:

 代码片段1:"retrieveKnowledge 检索行业知识库"
     ↓
 向量:[0.15, -0.42, 0.81, ..., 0.19]
 ​
 代码片段2:"RuleOptimizationClient 规则调优"
     ↓
 向量:[0.11, -0.48, 0.75, ..., 0.25]
2.2 相似度计算
 查询向量 vs 代码向量1 → 余弦相似度:0.92 ⭐⭐⭐⭐⭐
 查询向量 vs 代码向量2 → 余弦相似度:0.85 ⭐⭐⭐⭐
 查询向量 vs 代码向量3 → 余弦相似度:0.45 ⭐
2.3 索引结构(类似 HNSW)

代码库会被预先索引:

 1. 代码解析:提取函数、类、注释、变量名等
 2. 向量化:每个代码块生成向量
 3. 建立索引:使用类似HNSW的索引结构
 4. 存储:向量和代码位置的映射关系

检索时:

 你的查询
     ↓
 向量化
     ↓
 通过索引快速定位(类似HNSW,不遍历所有代码)
     ↓
 返回Top-K最相关的代码片段

实际工作流程

当你问:"企业规则检索合思知识库"时:

步骤1:语义理解
 你的问题语义:
 - 核心概念:企业规则、检索、知识库
 - 业务场景:规则调优、知识检索
 - 技术关键词:retrieve、knowledge、rule
步骤2:向量检索
 查询向量:[0.12, -0.45, 0.78, ...]
     ↓
 索引检索(类似HNSW,只访问部分代码)
     ↓
 找到Top-K候选:
 1. ApprovalMcpServer.retrieveKnowledge() - 相似度0.95
 2. RuleJobService.getKnowledgeFromCache() - 相似度0.88
 3. PromptUtils.getRetrieveKnowledgePrompt() - 相似度0.82
步骤3:结果排序和返回
 按相似度排序,返回最相关的代码位置:
 - ApprovalMcpServer.java:338 (retrieveKnowledge方法)
 - RuleJobService.java:190 (storeKnowledgeToCache方法)
 - PromptUtils.java:130 (RETRIEVE_KNOWLEDGE_PROMPT)

与传统搜索区别

传统文本搜索(grep)
 查询:"retrieveKnowledge"
     ↓
 精确匹配包含"retrieveKnowledge"的行
     ↓
 结果:
 - ApprovalMcpServer.java:338: public JsonNode retrieveKnowledge(...)
 - RuleJobService.java:200: Object knowledge = getKnowledgeFromCache(...)  ❌ 不匹配
语义搜索(codebase_search)
 查询:"企业规则检索合思知识库"
     ↓
 理解语义:规则、检索、知识库
     ↓
 找到语义相关的代码:
 - retrieveKnowledge() ✅ 语义匹配
 - getKnowledgeFromCache() ✅ 语义匹配
 - storeKnowledgeToCache() ✅ 语义匹配
 - RuleOptimizationClient ✅ 语义匹配

索引构建过程

代码库索引的构建(后台自动完成):

 1. 代码解析阶段:
    ├─ 提取类名、方法名、变量名
    ├─ 提取注释和文档
    ├─ 提取代码结构(if/for/while等)
    └─ 提取导入和依赖关系
 2. 向量化阶段:
    ├─ 使用代码专用的Embedding模型
    ├─ 考虑代码的语法结构
    ├─ 考虑变量名和函数名的语义
    └─ 考虑注释和文档的语义
 3. 索引构建阶段:
    ├─ 建立向量索引(类似HNSW)
    ├─ 建立代码位置映射
    ├─ 建立文件路径索引
    └─ 建立代码块边界信息
 4. 存储阶段:
    └─ 向量 + 元数据(文件路径、行号、代码类型)

为什么能准确找到?

  1. 多维度匹配你的问题:"企业规则检索合思知识库" ↓匹配维度:├─ 关键词匹配:规则、检索、知识库├─ 语义匹配:retrieve、knowledge、rule├─ 上下文匹配:规则调优、知识检索└─ 业务场景匹配:企业规则、行业知识

  2. 代码理解能力代码片段:"retrieveKnowledge 从Redis获取原始规则列表,检索行业知识库" ↓理解到的信息:├─ 功能:检索知识├─ 输入:原始规则列表├─ 数据源:行业知识库├─ 存储:Redis└─ 业务:规则调优

  3. 上下文关联找到 retrieveKnowledge 后: ↓自动关联:├─ 调用者:RuleOptimizationClient├─ 依赖:RuleJobService├─ 配置:PromptUtils└─ 相关工具:optimizeRules

实际案例对比

场景:查找"规则调优相关的代码"

传统grep方式:

 grep -r "规则调优" .
 # 结果:可能找到0个(如果代码里没有这个中文词)
 # 或者需要知道英文关键词:rule optimization

语义搜索方式:

 codebase_search("规则调优相关的代码")
 # 结果:
 # 1. RuleOptimizationClient.java ✅
 # 2. RuleJobService.java ✅  
 # 3. ApprovalMcpServer.retrieveKnowledge() ✅
 # 4. PromptUtils.getRetrieveKnowledgePrompt() ✅
 # 即使代码里没有"规则调优"这个词,也能找到!

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐