答案生成流程

本章将详细解析 RAG(检索增强生成)系统中答案生成的完整流程。内容涵盖从用户消息嵌入、相关知识检索、提示词构建,到大模型生成最终回答的各个关键环节。通过代码示例和流程说明,帮助读者理解每一步的实现方式及其在实际应用中的作用,确保生成结果具备可追溯性和高质量。

完整 RAG 流程概览

下面通过追踪 llmGenerate() 的调用路径,梳理检索到的上下文如何被组织进提示词并交由模型生成最终回答。

  1. 向量嵌入与检索:用户消息先被嵌入为查询向量,用于在向量库中检索相关上下文。
  2. 提示词构建:buildPrompt() 将用户问题、检索上下文、历史对话整合为结构化提示词。
  3. 大模型生成:llmGenerate() 将提示词发送给指定 LLM(如 qwen-turbo-latest)。
// worker.ts 片段
const embedder = createEmbedder(env);
const [qv] = await embedder.embed([message], Number(env.EMBED_DIM));
const { contexts, sources, usedFallback } = await getRelevantDocuments(env, qv, 8, language);
const prompt = buildPrompt(message, contexts, history, language);
const answer = await llmGenerate(env, prompt);

提示词结构(示例:中文)

以下是实际提示词的结构示例,便于理解各部分内容如何组织:

你是 Jimmy Song,一位经验丰富的云原生架构师……

--- 我的博客内容 ---
<检索得到的上下文片段>

--- 对话历史 ---
用户:...
助手:...

--- 问题 ---
<用户当前问题>

请基于知识库片段回答……

关键说明:向量不直接进入 LLM

嵌入向量仅用于相似度搜索,不会直接传递给大模型;传入模型的是检索后的文本上下文构成的提示词。

llmGenerate() 调用 Qwen 示例

下面展示如何调用 Qwen 模型生成回答:

if (env.PROVIDER === 'qwen') {
 const body = {
    model: env.LLM_MODEL || 'qwen-plus',
    messages: [
     { role: 'system', content: '请用中文回答,并在末尾列出来源路径。' },
     { role: 'user', content: prompt }
    ]
 };
}

模型响应示例

以下是模型返回内容的示例,便于理解接口结构:

{
 "choices": [{
    "message": {"content": "Istio 是一个开源的服务网格平台..."}
 }]
}

系统会抽取回答内容并结合之前跟踪的 sources 一起返回给前端组件。

小结

下表总结了 RAG 流程各阶段的输入、输出及作用:

阶段输入输出作用
嵌入用户消息查询向量用于向量检索
检索查询向量上下文片段集合构建答案依据
提示词上下文 + 问题 + 历史结构化文本供 LLM 生成回答
生成提示词回答文本最终呈现内容

该流水线确保回答“有据可依”,同时避免向量数据直接暴露给大模型,提高可解释性与安全性。

文章导航

独立页面

这是书籍中的独立页面。

书籍首页

评论区