Ai Agent Rag

Ai Agent Rag

July 19, 2026

RAG(Retrieval-Augmented Generation)是什么?

RAG是一种结合了检索(Retrieval)和生成(Generation)的技术,用于增强大语言模型的回答能力。 它的核心思想是:

  1. 检索:从外部知识库中检索与用户问题相关的文档或信息片段。
  2. 生成:将检索到的文档作为上下文,结合大语言模型生成最终的回答。 RAG的优势在于:
  • 提高回答的准确性:通过检索相关文档,减少模型凭空生成的错误信息。
  • 支持知识更新:知识库可以独立更新,而不需要重新训练模型。
  • 适应特定领域:可以针对特定领域构建知识库,使模型在该领域的回答更专业。

R 是体力活:现在向量数据库都很成熟了,搜得准不准很大程度看模型,工程上就是调参数。 A 是艺术活:怎么把 R 找来的东西,用 G 最容易听懂的方式喂进去,这是 RAG 工程成败的关键。 G 是技术活:大模型的能力决定了天花板。

为啥需要 RAG?

技术原理、工程成本、业务合规 三个维度,详细解释为什么我们需要 RAG。

解决大模型的“先天缺陷”(技术原理层面)

知识的静态性(Knowledge Cutoff)

  • 问题:大模型的知识停留在训练时刻(比如 GPT-5 pro Turbo 是 2025 年 12 月)。之后新的知识、事件、法规、技术都无法被模型掌握。你问它“2026 年 1 月 1 日发生了什么大事?”,它只能回答“我不知道”。

  • RAG 的作用:热更新。RAG 把知识库变成了“外挂硬盘”。只要把最新的文档丢进向量数据库,模型立刻就能回答新问题,不需要重新训练(训练成本极高)。

幻觉问题(Hallucination)

  • 问题:大模型是“概率预测”专家,不是“事实检索”专家。当它不知道答案时,为了迎合你的提问,它会一本正经地胡说八道(例如编造“严复写过《相对论导论》”)。

  • RAG 的作用: grounding(接地气)。RAG 强制模型在生成答案前必须先阅读给定的文本(Context)。我们在 Prompt 里加了一句“不知道就说不知道”,这就像给教授发了试卷并规定“本题答案必须引用原文”。

缺乏私有知识(Private Data)

问题:大模型没见过你们公司的内部 Wiki、财务报表、客户聊天记录。你没法问它“我们公司上个季度的 KPI 完成了吗?”。

RAG 的作用:私有化部署。RAG 可以把企业的私域数据向量化。数据可以不出内网,既利用了大模型的能力,又保证了数据安全。

黑盒问题(Black Box & Citation)

问题:大模型说完了就完了,你不知道它这话是从哪听来的。如果它引用法条判案,律师需要知道是哪条法律第几款。

RAG 的作用:可追溯性(Citation)。因为 RAG 把检索到的 Document 给了模型,我们可以很容易地在答案后面附上引用来源(比如“来源:第 3 章第 2 节”)。这在法律、医疗、学术领域至关重要。

降低落地成本(工程经济层面)

微调(Fine-tuning)太贵了

对比:

  1. 微调:想让模型学习新知识,需要准备海量标注数据,租用昂贵的 GPU 集群进行训练,耗时几天甚至几周,花费成千上万美金。而且知识过期了还得重训。
  2. RAG:只需要把文档切分、Embedding(这个成本极低,甚至可以用 CPU 跑),存进向量库。几分钟搞定,几十块钱人民币。
  3. 结论:RAG 是性价比最高的知识注入方式。

长上下文的陷阱

误区:有人会说“现在的模型上下文窗口很大(128k tokens),我直接把整本书塞进去不就行了?” 真相:

  • 性能:把整本书塞进 Prompt(这叫 Long Context),推理速度极慢,且成本是按 Token 算的,极其昂贵。

  • 注意力分散:研究表明,模型在处理超长文本时,容易“忘记”中间的内容(Lost in the Middle)。

  • RAG 的优势:RAG 只把最相关的 3-5 个片段 喂给模型。这大大降低了 Token 消耗,提高了响应速度,且因为上下文短而精准,模型回答质量反而更高。

适应复杂业务场景(业务逻辑层面)

权限控制(Access Control)

场景:在公司里,实习生不能看 CEO 的财报,HR 不能看技术部的核心代码。

RAG 的实现:我们可以在 Metadata 里加入权限标签(如 level: “public” 或 level: “confidential”)。在检索(Retrieval)阶段,根据用户身份注入 Filter,直接把无权限的文档排除在向量搜索之外。这是单纯的大模型做不到的。

多轮对话与记忆

场景:用户问:“严复翻译了什么书?” -> 模型回答:“《天演论》”。 -> 用户接着问:“那他是在哪一年翻译的?”

RAG 的作用:RAG 可以将历史对话也作为一种“检索源”,或者将历史对话作为上下文注入。这让模型拥有了“短期记忆”,能理解上下文的指代关系。

RAG 例子

rag-demo.mjs
import "dotenv/config";
import { ChatOpenAI, OpenAIEmbeddings } from "@langchain/openai";
import { Document } from "@langchain/core/documents";
import { MemoryVectorStore } from "@langchain/classic/vectorstores/memory";

// 1. 初始化大模型
const model = new ChatOpenAI({
  temperature: 0, // 0代表回答最严谨,不发散
  model: process.env.MODEL_NAME,
  apiKey: process.env.OPENAI_API_KEY,
  configuration: {
    baseURL: process.env.OPENAI_BASE_URL,
  },
});

// 2. 初始化Embedding模型
const embeddings = new OpenAIEmbeddings({
  apiKey: process.env.OPENAI_API_KEY,
  model: process.env.EMBEDDINGS_MODEL_NAME,
  configuration: {
    baseURL: process.env.OPENAI_BASE_URL,
  },
});

/**
 * 知识库:中国近代启蒙先驱
 * metadata全中文键名
 */
const documents = [
  new Document({
    pageContent: `严复是中国近代著名的启蒙思想家、翻译家,曾任北洋水师学堂总办。他翻译了《天演论》,首次将“物竞天择,适者生存”的进化论思想引入中国,对清末维新运动产生了深远影响。他还提出了翻译的“信、达、雅”三原则,至今仍被翻译界奉为圭臬。`,
    metadata: { 人物: "严复", 身份: "思想家/翻译家", 年份: 1897 },
  }),
  new Document({
    pageContent: `梁启超是戊戌变法的主要领袖之一,号饮冰室主人。他倡导“诗界革命”“小说界革命”,代表作《少年中国说》中的“少年强则国强”至今广为流传。他主张君主立宪,重视国民启蒙教育,一生著述颇丰,合编为《饮冰室合集》。`,
    metadata: { 人物: "梁启超", 身份: "政治家/学者", 年份: 1899 },
  }),
  new Document({
    pageContent: `詹天佑是中国近代铁路工程专家,被誉为“中国铁路之父”。1905年他主持修建中国自主设计的第一条铁路——京张铁路,创新采用“人”字形线路设计,克服了八达岭隧道的施工难题,为中国铁路事业奠定了坚实基础。`,
    metadata: { 人物: "詹天佑", 身份: "工程师", 年份: 1905 },
  }),
  new Document({
    pageContent: `1897年严复在天津创办《国闻报》,作为维新派的舆论阵地之一,与上海的《时务报》(梁启超主笔)南北呼应,宣传变法图强的思想。《国闻报》经常刊登严复翻译的西方社科著作选段,是当时重要的启蒙刊物。`,
    metadata: { 人物: "严复", 身份: "媒体人", 年份: 1897 },
  }),
  new Document({
    pageContent: `严复与梁启超虽同为维新派代表人物,但思想侧重有所不同:严复更注重引进西方自然科学与社会科学理论,希望通过思想启蒙推动变革;梁启超更注重政治宣传与国民意识觉醒,文风通俗易懂,受众更广。两人的分歧也反映了清末启蒙运动的多元性。`,
    metadata: { 人物: "严复/梁启超", 身份: "思想对比", 年份: 1898 },
  }),
  new Document({
    pageContent: `戊戌变法失败后,严复继续从事翻译与教育工作,先后担任北京大学首任校长、复旦公学校长等职,培养了一大批近代人才。他晚年趋于保守,对激进的革命思潮持保留态度,1921年在福州病逝。`,
    metadata: { 人物: "严复", 身份: "教育家", 年份: 1921 },
  }),
  new Document({
    pageContent: `詹天佑除了主持修建京张铁路外,还参与制定了中国的铁路建设规范,培养了第一批中国本土铁路工程师。他在1919年参与协约国远东铁路会议时积劳成疾,同年逝世,临终前仍牵挂中国铁路事业的发展。`,
    metadata: { 人物: "詹天佑", 身份: "工程师", 年份: 1919 },
  }),
];

// 3. 创建向量存储
// 注意:MemoryVectorStore重启后会丢失数据,仅适合Demo
const vectorStore = await MemoryVectorStore.fromDocuments(
  documents,
  embeddings,
);

// 4. 创建检索器
// ⚠️ 重点提醒:MemoryVectorStore的filter必须是函数,不能用{人物:"严复"}这种对象形式!
// 如果要过滤严复的文档,取消下面filter的注释即可
const retriever = vectorStore.asRetriever({
  k: 3, // 召回最相关的3个片段
  // filter: (doc) => doc.metadata.人物 === "严复", // 仅检索严复相关的文档
});

// 5. 测试问题(全中文,覆盖不同类型)
const questions = [
  "谁翻译了《天演论》?", // 事实性问题
  "严复和梁启超的思想有什么不同?", // 对比性问题
  "中国近代第一位铁路总工程师是谁?他主持修建了哪条铁路?", // 多跳问题
  "戊戌变法期间严复创办了什么报纸?", // 细节问题
];

// 6. 循环处理每个问题(标准RAG流程)
for (const question of questions) {
  console.log("=".repeat(80));
  console.log(`问题: ${question}`);
  console.log("=".repeat(80));

  // R环节:检索相关文档
  const retrievedDocs = await retriever.invoke(question);
  
  // 获取相似度评分(调试用)
  const scoredResults = await vectorStore.similaritySearchWithScore(question, 3);

  // 打印检索结果(调试用,生产环境可删除)
  console.log("\n【检索到的文档及相似度】");
  retrievedDocs.forEach((doc, i) => {
    const scoredResult = scoredResults.find(
      ([scoredDoc]) => scoredDoc.pageContent === doc.pageContent
    );
    const score = scoredResult ? scoredResult[1] : null;
    const similarity = score !== null ? (1 - score).toFixed(4) : "N/A";
    
    console.log(`\n[文档${i + 1}] 相似度: ${similarity}`);
    console.log(`内容: ${doc.pageContent.substring(0, 120)}...`);
    console.log(`元数据: 人物=${doc.metadata.人物}, 身份=${doc.metadata.身份}, 年份=${doc.metadata.年份}`);
  });

  // A环节:增强上下文(拼接检索结果+约束条件)
  // map 整理资料,这是在 augmentation
  const context = retrievedDocs
    .map((doc, i) => `[资料${i + 1}(来源:${doc.metadata.人物},年份:${doc.metadata.年份})]\n${doc.pageContent}`)
    .join("\n\n━━━━━\n\n");

  // 7. 构建提示词(Prompt)模板,这是在增强约束
  // 用户的 question + 增强的 context 作为输入,要求模型严格根据 context 回答
  const prompt = `你是一名中国近代史研究员,请根据以下提供的史料回答问题,要求严谨准确,符合史实。
如果提供的史料中没有相关内容,请明确回答“根据现有资料无法回答”,不要编造信息。

史料:
${context}

问题:${question}

研究员回答:`;

  // G环节:大模型生成回答
  console.log("\n【AI回答】");
  const response = await model.invoke(prompt);
  console.log(response.content);
  console.log("\n");
}

执行

node rag-demo.mjs

================================================================================
问题: 谁翻译了《天演论》?
================================================================================

【检索到的文档及相似度】

[文档1] 相似度: 0.3705
内容: 严复是中国近代著名的启蒙思想家、翻译家,曾任北洋水师学堂总办。他翻译了《天演论》,首次将“物竞天择,适者生存”的进化论思想引入中国,对清末维新运动产生了深远影响。他还提出了翻译的“信、达、雅”三原则,至今仍被翻译界奉为圭臬。...
元数据: 人物=严复, 身份=思想家/翻译家, 年份=1897

[文档2] 相似度: 0.5519
内容: 詹天佑是中国近代铁路工程专家,被誉为“中国铁路之父”。1905年他主持修建中国自主设计的第一条铁路——京张铁路,创新采用“人”字形线路设计,克服了八达岭隧道的施工难题,为中国铁路事业奠定了坚实基础。...
元数据: 人物=詹天佑, 身份=工程师, 年份=1905

[文档3] 相似度: 0.5825
内容: 詹天佑除了主持修建京张铁路外,还参与制定了中国的铁路建设规范,培养了第一批中国本土铁路工程师。他在1919年参与协约国远东铁路会议时积劳成疾,同年逝世,临终前仍牵挂中国铁路事业的发展。...
元数据: 人物=詹天佑, 身份=工程师, 年份=1919

【AI回答】
研究员回答:严复翻译了《天演论》。


================================================================================
问题: 严复和梁启超的思想有什么不同?
================================================================================

【检索到的文档及相似度】

[文档1] 相似度: 0.1392
内容: 严复与梁启超虽同为维新派代表人物,但思想侧重有所不同:严复更注重引进西方自然科学与社会科学理论,希望通过思想启蒙推动变革;梁启超更注重政治宣传与国民意识觉醒,文风通俗易懂,受众更广。两人的分歧也反映了清末启蒙运动的多元性。...
元数据: 人物=严复/梁启超, 身份=思想对比, 年份=1898

[文档2] 相似度: 0.2778
内容: 严复是中国近代著名的启蒙思想家、翻译家,曾任北洋水师学堂总办。他翻译了《天演论》,首次将“物竞天择,适者生存”的进化论思想引入中国,对清末维新运动产生了深远影响。他还提出了翻译的“信、达、雅”三原则,至今仍被翻译界奉为圭臬。...
元数据: 人物=严复, 身份=思想家/翻译家, 年份=1897

[文档3] 相似度: 0.3525
内容: 戊戌变法失败后,严复继续从事翻译与教育工作,先后担任北京大学首任校长、复旦公学校长等职,培养了一大批近代人才。他晚年趋于保守,对激进的革命思潮持保留态度,1921年在福州病逝。...
元数据: 人物=严复, 身份=教育家, 年份=1921

【AI回答】
严复和梁启超的思想有所不同,主要体现在侧重点上。严复更注重引进西方自然科学与社会科学理论,希望通过思想启蒙推动变革;而梁启超更注重政治宣传与国民意识觉醒,其文风通俗易懂,受众更广。两人的分歧也反映了清末启蒙运动的多元性。


================================================================================
问题: 中国近代第一位铁路总工程师是谁?他主持修建了哪条铁路?
================================================================================

【检索到的文档及相似度】

[文档1] 相似度: 0.3454
内容: 詹天佑是中国近代铁路工程专家,被誉为“中国铁路之父”。1905年他主持修建中国自主设计的第一条铁路——京张铁路,创新采用“人”字形线路设计,克服了八达岭隧道的施工难题,为中国铁路事业奠定了坚实基础。...
元数据: 人物=詹天佑, 身份=工程师, 年份=1905

[文档2] 相似度: 0.3806
内容: 詹天佑除了主持修建京张铁路外,还参与制定了中国的铁路建设规范,培养了第一批中国本土铁路工程师。他在1919年参与协约国远东铁路会议时积劳成疾,同年逝世,临终前仍牵挂中国铁路事业的发展。...
元数据: 人物=詹天佑, 身份=工程师, 年份=1919

[文档3] 相似度: 0.5576
内容: 戊戌变法失败后,严复继续从事翻译与教育工作,先后担任北京大学首任校长、复旦公学校长等职,培养了一大批近代人才。他晚年趋于保守,对激进的革命思潮持保留态度,1921年在福州病逝。...
元数据: 人物=严复, 身份=教育家, 年份=1921

【AI回答】
中国近代第一位铁路总工程师是詹天佑,他主持修建了京张铁路。


================================================================================
问题: 戊戌变法期间严复创办了什么报纸?
================================================================================

【检索到的文档及相似度】

[文档1] 相似度: 0.2223
内容: 1897年严复在天津创办《国闻报》,作为维新派的舆论阵地之一,与上海的《时务报》(梁启超主笔)南北呼应,宣传变法图强的思想。《国闻报》经常刊登严复翻译的西方社科著作选段,是当时重要的启蒙刊物。...
元数据: 人物=严复, 身份=媒体人, 年份=1897

[文档2] 相似度: 0.2908
内容: 戊戌变法失败后,严复继续从事翻译与教育工作,先后担任北京大学首任校长、复旦公学校长等职,培养了一大批近代人才。他晚年趋于保守,对激进的革命思潮持保留态度,1921年在福州病逝。...
元数据: 人物=严复, 身份=教育家, 年份=1921

[文档3] 相似度: 0.3131
内容: 严复是中国近代著名的启蒙思想家、翻译家,曾任北洋水师学堂总办。他翻译了《天演论》,首次将“物竞天择,适者生存”的进化论思想引入中国,对清末维新运动产生了深远影响。他还提出了翻译的“信、达、雅”三原则,至今仍被翻译界奉为圭臬。...
元数据: 人物=严复, 身份=思想家/翻译家, 年份=1897

【AI回答】
研究员回答:根据现有资料,严复在戊戌变法期间创办了《国闻报》。

References

  1. LLM knowledge cutoff
Last updated on