上回看到本地运行 LLM,之后因为琐事被耽搁没有继续拓展学习,今天就来尝试下本地跑 RAG 来实现更精准有效的检索。
RAG 的基本原理简单来说就几步:
- 文本切割后向量化
- 基于向量化的结果检索
- 将检索的结果交给 LLM 使用
简单看个 Demo
当我直接运行时,问它 “子擎 Lite” 是什么?,它给我的结果是一个游戏引擎,拼音是 “ZiXin Lite”,很明显是一个胡乱拼凑的假的东西。
但当我去米物百科把“子擎 Lite”的详细信息喂给它时,它就可以准确的描述出相关信息,并总结后告诉我是什么。
文本向量化:
// 准备的知识库
documents = [
content
]
client = chromadb.Client()
collection = client.create_collection(name="docs")
for i, d in enumerate(documents):
response = ollama.embeddings(model="mxbai-embed-large", prompt=d)
embedding = response["embedding"]
collection.add(
ids=[str(i)],
embeddings=[embedding],
documents=[d]
)
知识库中进行检索
response = ollama.embeddings(
prompt=prompt,
model="mxbai-embed-large"
)
results = collection.query(
query_embeddings=[response["embedding"]],
n_results=1
)
data = results['documents'][0][0]
检索后的结果交给 LLM 读取使用
output = ollama.generate(
model="llama3",
prompt=f"Using this data: {data}. Respond to this prompt: {prompt}",
)
print(output['response'])
这样,一个最简单的使用 RAG 的大模型就实现了。
之前有看过 Fine-tuning,发现成本好像有点高,所以就先从 RAG 入手,从一个角开始,一步步的去了解整个体系。