从"图书馆查资料"到"智能研究员"——RAG技术的进化之路
RAG(Retrieval-Augmented Generation)已经从一个简单的"查资料+写答案"模式,进化出了多种高级形态。就像从"图书馆管理员"进化成了"研究员+分析师+撰稿人"。
| 阶段 | 名称 | 特点 |
|---|---|---|
| 1.0 | 基础RAG | 简单向量检索+拼接上下文 |
| 2.0 | 高级RAG | 查询重写、重排序、混合检索 |
| 3.0 | 模块化RAG | 检索、生成模块化,灵活组合 |
| 4.0 | Agentic RAG | Agent自主决策检索策略 |
不是一次性检索,而是多轮决策:先检索→分析→发现信息不足→再检索→整合→生成。
// Agentic RAG流程
const agenticRAG = {
async answer(question) {
let context = [];
let iterations = 0;
let answer = null;
while (iterations < 3 && !answer) {
// 1. 分析还需要什么信息
const gapAnalysis = await this.analyzeGap(question, context);
if (gapAnalysis.sufficient) {
// 信息足够,生成答案
answer = await this.generate(question, context);
} else {
// 2. 针对缺口进行精确检索
const newDocs = await this.retrieve(gapAnalysis.missingKeywords);
context = [...context, ...newDocs];
iterations++;
}
}
return answer;
}
};
将文档构建成知识图谱,通过实体关系进行多跳推理。适合复杂关联查询。
查询"OpenClaw创始人的 mentor 是谁"→找到创始人→找 mentor 关系→返回结果
不仅检索文本,还检索图片、音频、视频。通过CLIP等模型统一嵌入空间。
生成过程中不断自我验证:"这段内容有事实依据吗?"→无依据→重新检索。
结合多种检索方式:向量检索+关键词检索+结构化查询,加权融合结果。
tdai_memory_search就是RAG的实践!它从长期记忆中检索相关信息,增强当前对话。
// 结合OpenClaw工具构建RAG客服
async function customerServiceRAG(userQuestion) {
// 1. 查询重写(优化检索)
const optimizedQuery = await sessions_spawn({
task: `将用户问题改写为更适合检索的形式:${userQuestion}`,
runtime: "subagent"
});
// 2. 多路检索
const [vectorResults, keywordResults] = await Promise.all([
vectorSearch(optimizedQuery), // 向量检索
keywordSearch(optimizedQuery), // 关键词检索
]);
// 3. 重排序(Reranking)
const mergedResults = [...vectorResults, ...keywordResults];
const rankedResults = await rerank(mergedResults, userQuestion);
// 4. 取Top-K作为上下文
const context = rankedResults.slice(0, 5).map(r => r.content).join("\n\n");
// 5. 生成回答
const answer = await generateWithContext(userQuestion, context);
return answer;
}
// Agentic RAG:自主决定检索策略
async function agenticDocAssistant(query) {
const agent = {
state: { context: [], retrieved: [], iterations: 0 },
async think() {
// Agent判断是否已足够回答
const assessment = await sessions_spawn({
task: `基于当前上下文,判断是否足以回答"${query}"?
如果不足,指出还需要什么信息。`,
runtime: "subagent"
});
return assessment;
},
async retrieve(keywords) {
// 执行检索
const results = await tdai_memory_search({ query: keywords, limit: 5 });
this.state.retrieved.push(...results);
this.state.context = this.formatContext(this.state.retrieved);
},
async generate() {
// 生成最终答案
return await sessions_spawn({
task: `基于以下上下文回答问题"${query}":
${this.state.context}`,
runtime: "subagent"
});
}
};
// 执行循环
while (agent.state.iterations < 3) {
const assessment = await agent.think();
if (assessment.sufficient) break;
await agent.retrieve(assessment.missingInfo);
agent.state.iterations++;
}
return await agent.generate();
}
| 优化点 | 方法 | 效果 |
|---|---|---|
| 查询重写 | 用LLM优化用户查询 | 检索准确率+30% |
| 分块策略 | 语义分块>固定长度分块 | 召回率+25% |
| 混合检索 | 向量+关键词+结构化 | 覆盖率+40% |
| 重排序 | Cross-encoder精排 | Top-K准确率+35% |
| 上下文压缩 | 提取关键片段 | 减少Token消耗 |