EdgeOne Makers RAG 与知识库
上一篇 讲了 AI 原生开发。这篇讲当下最火的一个 AI 落地模式:RAG(检索增强生成,Retrieval-Augmented Generation)。它让大模型”先查资料再回答”,解决幻觉和知识过期的问题。结合 Makers 的存储和 AI 能力,你可以很快搭起一个专属知识库。
RAG 解决什么问题
大模型的知识是训练时定死的,不知道你的私有文档、最新公告、内部手册。直接问,它要么瞎编,要么说不知道。
RAG 的思路是:回答之前,先从你的资料里检索相关片段,拼进提示词,让模型”带着资料”作答。
| 没有 RAG | 有 RAG |
|---|---|
| 答案可能编造 | 答案有据可依 |
| 不知道最新/私有信息 | 能引用你的文档 |
| 难追溯来源 | 可附带出处 |
整体流程
文档 -> 切片 -> 生成 Embedding -> 存入向量库
|
用户提问 -> 生成 Embedding -> 向量检索最相似片段 -> 拼进 Prompt -> 大模型作答
用到的 Makers 能力:
| 环节 | 用到的能力 | 文章 |
|---|---|---|
| 存文档 | Blob / KV | 存储教程 |
| 存向量 | 向量数据库 | 数据库存储 |
| 生成 Embedding | AI 模型 | 模型与厂商 |
| 作答 | AI 模型 | AI 原生开发 |
| 对外服务 | Cloud Functions | Cloud Functions 基础 |
第一步:准备并切片文档
把知识库文档(产品手册、FAQ、博客)放到 Blob 存储,然后按固定长度或按语义切片。切片太大会噪音多,太小会丢上下文,一般 300–800 字一段比较稳。
第二步:生成向量并入库
调用嵌入模型把每段文本转成向量,连同原文存进向量表。
// 伪代码:切片后逐段向量化入库
import { embed, storeVector } from "makers-ai";
for (const chunk of chunks) {
const vector = await embed(chunk.text); // 调嵌入模型
await storeVector({ // 存入向量库
text: chunk.text,
vector,
source: chunk.source,
});
}
第三步:检索与作答
用户提问时,把问题也向量化,检索最相近的几段,拼进提示词交给大模型。
// 伪代码:检索 + 生成
export async function handler(request) {
const question = (await request.json()).question;
const qVector = await embed(question);
const hits = await searchVector(qVector, { topK: 3 }); // 取最相似 3 段
const context = hits.map(h => h.text).join("\n---\n");
const answer = await chat([
{ role: "system", content: `根据以下资料回答,不要编造:\n${context}` },
{ role: "user", content: question },
]);
return new Response(JSON.stringify({ answer, sources: hits.map(h => h.source) }));
}
sources 把引用来源一并返回,前端可以展示”答案来自哪几篇文档”,增强可信度。
提升效果的小技巧
| 技巧 | 说明 |
|---|---|
| 重排序 | 向量召回后用小模型再排一次,提升相关度 |
| 元信息过滤 | 按时间、分类先过滤再检索 |
| 分块策略 | 标题带进块,保留结构信息 |
| 缓存高频问题 | 相似问题直接返回,省 token |
速查卡片
| 要点 | 说明 |
|---|---|
| RAG 是什么 | 先检索资料,再让大模型基于资料作答 |
| 流程 | 切片 -> 向量化入库 -> 检索 -> 拼 Prompt -> 生成 |
| 用到能力 | Blob/向量库 + 嵌入模型 + 大模型 + Functions |
| 关键参数 | 切片大小、topK、是否重排序 |
| 价值 | 减少幻觉、可用私有/最新知识、可溯源 |