关于 context-retrieval
context-retrieval 是一项 Agent 技能,用于检索知识库内容,为回答提供事实依据。它涵盖从语义与关键词搜索到重排、引用和验证的 RAG 流程。
主要功能
- 01查询向量化与向量搜索
- 02语义、关键词及混合检索
- 03候选内容重排
- 04结合来源元数据组装上下文
- 05验证回答并添加引用
适用场景
- 01根据源文件回答代码库问题
- 02检索产品文档以处理支持问题
- 03为 RAG 回答构建带引用的上下文
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ seb1n/ awesome-ai-agent-skills --skill context-retrieval安装后在 Claude Code 中输入/context-retrieval确认已加载。
详细介绍
上下文检索
上下文检索是指从知识库中查找并汇集最相关的信息片段,为 AI Agent 的回答提供依据,确保内容准确且及时。这是检索增强生成(RAG)的核心,可确保生成的内容准确且可验证,而不是凭空编造。
工作流
-
嵌入查询:使用嵌入模型(例如 OpenAI 的
text-embedding-3-small、Cohere 的embed-v3,或bge-large等开源模型)将用户的自然语言查询转换为稠密向量表示。嵌入向量能够捕捉查询的语义,以便与存储的文档进行比对。 -
搜索向量存储:将查询嵌入向量发送到向量数据库(Pinecone、Weaviate、Qdrant、Chroma 等),执行近似最近邻(ANN)搜索。请求排名前 k 的候选文本块,通常 k = 10–20,以便为重排器提供充足的材料。
-
重排结果:使用交叉编码器重排器(例如 Cohere Rerank、
bge-reranker-large或 ColBERT 模型)处理候选文本块。重排器会通过完整注意力机制,根据原始查询为每个文本块评分,其相关性评分比单独使用余弦相似度准确得多。保留排名前 n 的结果(通常 n = 3–5)。 -
组装上下文窗口:按相关性评分从高到低,将选定的文本块合并为一个上下文块。在每个文本块前添加来源元数据(文件路径、URL、页码),以便 Agent 引用来源。确保总 token 数量符合模型为提示词上下文部分分配的预算。
-
生成回答:将组装好的上下文与原始查询及系统指令一同传入大模型提示词,并在系统指令中告知模型只能依据所提供的上下文作答。这样可以让回答基于检索到的事实,减少幻觉。
-
验证并引用:生成回答后,核实答案引用的信息确实存在于检索到的文本块中。添加行内引用或参考资料部分,让用户能够将每项陈述追溯到来源文档。
核心概念
- 语义搜索:使用向量嵌入按含义而非精确关键词匹配查找文档。擅长处理释义和同义词,但可能会漏掉精确的技术术语。
- 关键词搜索(BM25):传统的词频搜索,擅长精确匹配和稀有词。速度快、易于理解,但无法识别同义词。
- 混合搜索:结合语义搜索和关键词搜索(例如,对 BM25 与余弦相似度评分进行加权融合),兼取两者之长。大多数生产级 RAG 系统都使用混合检索。
- 分块策略:文档必须先拆分成文本块,再进行索引。常见策略包括固定大小的 token 窗口(256–512 个 token,重叠 50 个 token)、按句子边界拆分,以及递归字符拆分。较小的文本块可提高精确度;较大的文本块则能保留更多上下文。
- 嵌入模型:嵌入模型的选择会影响检索质量。更大的模型(1024 维及以上)能捕捉更多细微差异,但存储和查询成本更高。选择前务必针对你的领域进行基准测试。
用法
要使用此技能,你需要一个已预先索引、文档嵌入向量存储在向量数据库中的知识库。输入自然语言查询。此技能会返回可直接用于组装提示词的检索上下文块,以及用于引用的来源元数据。
示例
示例 1:为代码问题检索代码库上下文
查询:“身份验证中间件如何验证 JWT 令牌?”
检索到的分块(重排后):
| 排名 | 来源 | 分数 | 片段 |
|---|---|---|---|
| 1 | src/middleware/auth.ts:14-38 | 0.94 | export function validateToken(req, res, next) { const token = req.headers.authorization?.split(' ')[1]; if (!token) return res.status(401).json({ error: 'Missing token' }); try { const decoded = jwt.verify(token, process.env.JWT_SECRET); req.user = decoded; next(); } catch (e) { return res.status(403).json({ error: 'Invalid token' }); } } |
| 2 | docs/auth-flow.md:8-22 | 0.87 | “JWT 使用 JWT_SECRET 环境变量,通过 HS256 签名。令牌 24 小时后过期。中间件从 Authorization 标头中提取令牌,验证签名,并将解码后的负载附加到 req.user。” |
| 3 | tests/auth.test.ts:5-19 | 0.72 | 涵盖有效令牌、过期令牌和格式错误令牌场景的测试用例。 |
组装后的提示词:
Answer the following question using ONLY the provided context. Cite file paths.
Context:
[1] src/middleware/auth.ts:14-38 — export function validateToken(req, res, next) { ... }
[2] docs/auth-flow.md:8-22 — The JWT is signed with HS256 using the JWT_SECRET env var...
[3] tests/auth.test.ts:5-19 — Test cases covering valid token, expired token...
Question: How does the authentication middleware validate JWT tokens?
示例 2:为支持问题检索产品文档
查询:“如果我无法再访问自己的邮箱,该如何重置密码?”
检索到的分块:
help/account-recovery.md(分数 0.91)—“如果无法访问注册邮箱,请前往 Settings > Account > Identity Verification。系统会要求你使用电话号码或政府签发的身份证件验证身份。验证通过后,你可以设置新的邮箱并重置密码。”help/password-reset.md(分数 0.85)—“要重置密码,请在登录页面点击‘Forgot Password’。重置链接将发送到你的注册邮箱。该链接 1 小时后失效。”
生成的回答:“由于你无法再访问邮箱,请使用身份验证流程:前往 Settings > Account > Identity Verification,通过电话号码或政府签发的身份证件验证身份,更新邮箱地址,然后从登录页面重置密码。[来源:help/account-recovery.md、help/password-reset.md]”
最佳实践
- 在生产环境中使用混合检索——结合 BM25 关键词搜索与语义向量搜索,效果始终优于单独使用任一种方法。
- 始终进行重排——与仅依赖嵌入向量余弦相似度相比,对排名前 20 的结果使用交叉编码器重排器,可显著提高精确率。
- 分块时使用重叠——在相邻分块之间保留 10–20% 的令牌重叠,避免关键内容被拆分到不同分块中。
- 包含元数据——将文件路径、章节标题、时间戳和作者信息与嵌入向量一同存储,以便追踪和引用检索到的上下文。
- 通过经验调整 top-k——检索比所需数量更多的候选结果(k = 15–20),然后让重排器筛选出最佳的 3–5 个结果。这样可以平衡召回率和精确率。
- 定期进行基准测试——在来自目标领域的带标签评估集上,使用 Recall@k、MRR 和 NDCG 等指标衡量检索质量。
边缘情况
- 未找到相关结果:当最高检索分数低于置信度阈值(例如 < 0.5)时,Agent 应承认信息不足,而不是捏造答案。
- 来源相互矛盾:如果检索到的分块包含冲突信息,应呈现双方观点并指出差异,而不是悄然选择其中一方。
- 内容陈旧或过时:数月前索引的文档可能已经过时。请在元数据中包含时间戳,并在分数接近时优先选择较新的分块。
- 查询过短或过长:单词查询可能产生嘈杂的结果——可考虑扩展查询。超长查询可能适合拆分为多个子查询,再合并结果。
- 多语言知识库:确保嵌入模型支持语料库中使用的语言,或在生成嵌入之前先进行翻译。