Context Retrieval(上下文检索)
用途
上下文检索是从知识库中查找并组装最相关信息,用以支撑 AI 智能体回答的过程。它是检索增强生成(RAG)的骨干,确保生成结果基于事实、最新数据,准确且可核验,而非凭空编造。
适用场景
当任务从一个语料库或知识库出发,需要为查询提供事实依据时使用。典型场景包括:针对代码库问题检索代码上下文、针对产品文档的支持类问题检索帮助文档等。
使用前提
使用该技能需要一个已预先建立索引的知识库,文档嵌入存放在向量数据库中。输入为自然语言查询。技能返回检索到的上下文块(可直接用于提示词组装)以及用于引用的来源元数据。
工作流程
-
嵌入查询:用嵌入模型(例如 OpenAI text-embedding-3-small、Cohere embed-v3 或 bge-large 等开源模型)将用户自然语言查询转换为稠密向量表示,以捕获查询的语义含义。
-
搜索向量库:将查询嵌入发送到向量数据库(Pinecone、Weaviate、Qdrant、Chroma 等),执行近似最近邻(ANN)搜索,取 top-k 候选片段,通常 k = 10–20,为后续重排序留足素材。
-
重排序结果:将候选片段送入交叉编码器重排序器(例如 Cohere Rerank、bge-reranker-large 或 ColBERT 模型)。重排序器用完整注意力对每个片段与原始查询打分,比仅用余弦相似度更准确。保留 top-n 结果(通常 n = 3–5)。
-
组装上下文窗口:将选中的片段按相关性得分降序拼接为单个上下文块。为每个片段前置来源元数据(文件路径、URL、页码),以便智能体引用来源。确保总 token 数符合模型为上下文部分预留的预算。
-
生成回答:将组装好的上下文与原查询、以及要求模型仅依据所提供上下文作答的系统指令一起送入 LLM 提示词,使回答基于检索事实,减少幻觉。
-
校验与引用:生成后核对答案是否确实引用了检索片段中存在的信息,附上行内引用或参考文献,让用户可追溯每项主张的来源文档。
关键概念
语义检索:用向量嵌入按含义而非精确关键词匹配找文档。擅长处理改写与同义词,但可能遗漏精确技术术语。
关键词检索(BM25):传统词频检索,擅长精确匹配和罕见词,快速且可解释,但对同义词不敏感。
混合检索:结合语义与关键词检索(例如对 BM25 与余弦相似度得分做加权融合),兼取两者之长。多数生产级 RAG 系统采用混合检索。
分块策略:文档在索引前须切分为块。常见策略包括固定 token 窗口(256–512 token,重叠 50 token)、句子边界切分与递归字符切分。块越小精度越高,块越大保留的上下文越多。
嵌入模型:嵌入模型的选择影响检索质量。较大的模型(1024+ 维度)能捕获更多细微差别,但存储与查询成本更高。选择前应先在自有领域上做基准测试。
示例一:为代码问题检索代码库上下文
查询:“认证中间件是如何校验 JWT token 的?”
重排序后的检索片段:
排名 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 签名。Token 24 小时后过期。中间件从 Authorization 头提取 token,校验签名,并将解码后的载荷附加到 req.user。”
排名 3,来源 tests/auth.test.ts:5-19,得分 0.72:覆盖有效 token、过期 token 与畸形 token 场景的测试用例。
组装后的提示词:
仅使用所提供上下文回答以下问题。引用文件路径。
上下文: [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...
问题:认证中间件是如何校验 JWT token 的?
示例二:为支持问题检索产品文档
查询:“如果我无法再访问邮箱,如何重置密码?”
检索片段:
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 关键词检索与语义向量检索结合,通常优于单独使用任一方式。
始终重排序——对 top-20 结果使用交叉编码器重排序,相比仅依赖嵌入余弦相似度能显著提升精度。
带重叠分块——相邻块之间使用 10–20% 的 token 重叠,避免关键信息被切分到块边界两侧。
包含元数据——在嵌入旁存储文件路径、章节标题、时间戳与作者,使检索到的上下文可追溯、可引用。
经验性调优 top-k——检索多于所需的候选(k = 15–20),再由重排序器收窄到最佳的 3–5 个,平衡召回与精度。
定期基准测试——在自有领域的标注评测集上,用 Recall@k、MRR 与 NDCG 等指标衡量检索质量。
边界情况
未找到相关结果:当最高检索得分低于置信度阈值(例如 < 0.5)时,智能体应承认信息不足,而不是编造答案。
来源相互矛盾:若检索片段包含冲突信息,应同时呈现两种观点并指出分歧,而不是悄然选择其一。
内容陈旧或过时:数月前索引的文档可能已过时。在元数据中包含时间戳,并在得分接近时优先采用较新的片段。
查询过短或过长:单词查询可能产生噪声结果,可考虑查询扩展;过长查询可分解为子查询并合并结果。
多语言知识库:确保嵌入模型支持语料中出现的语言,或在嵌入前增加翻译步骤。