大模型平时拿来聊聊天确实好用,但一问到公司内部情况或者没公开的数据,它就开始胡编乱造了。RAG(检索增强生成)算是个比较稳妥的解决办法。最近简单摸索了一下这套东西,整理点基础的概念,算是个入门备忘。
RAG 到底在干嘛
说白了,RAG 就是在让大模型回答之前,先帮它翻一下“资料库”。
1 | 以前直接问大模型: |
不用 RAG 的话,想让大模型懂你的数据就得去“微调”,那个成本太高了。RAG 就省事很多,把资料存进向量数据库就行。
大致的流程是怎样的
想要跑通 RAG,基本分两步走。
第一步:把资料存起来(建索引)
你得先把 PDF、Word 或者 Markdown 文档切碎,然后转成向量,存到库里。
1 | 原始文档 → 切成小块文本 → 算成向量(Embedding) → 存入向量数据库 |
如果是用 Python,一般用 LangChain 写,伪代码大概长这样:
1 | from langchain.text_splitter import RecursiveCharacterTextSplitter |
第二步:搜资料并生成回答
有人提问的时候,拿着问题去库里找最相近的那几段话,然后连着问题一起发给大模型。
1 | from langchain.chat_models import ChatOpenAI |
用 Node.js 怎么搞
我自己写前端多一点,其实拿 Node.js 也是能跑这套流程的。装几个 LangChain.js 的包就能干活。
1 | npm i langchain @langchain/openai @langchain/community chromadb |
写法跟 Python 差不多:
1 | import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai' |
踩到的几个坑
实际玩了一下,发现 RAG 门槛虽然低,但要想回答得准,还是得费点功夫:
- 切段大小很玄学:一篇文章如果一刀切到底,搜出来的信息太乱;如果切得太细,一句话截断了,上下文连不起来。一般 500-1000 字符一块,留一点重叠比较稳。
- 纯向量搜索不够看:光靠向量算相似度有时候会有点偏,现在比较流行加上传统的关键词搜索(比如 BM25)混合起来用,能准不少。
- 格式太乱影响解析:如果文档里面全是奇奇怪怪的表格和图片,切出来喂给大模型的效果就很惨,所以文档的清洗整理其实是最费劲的。
总之,这套方案感觉挺实用,打算后面慢慢打磨一下,接个微信机器人给自己查资料用。
评论加载中…