随笔

浅浅尝试下本地 RAG

上回看到本地运行 LLM,之后因为琐事被耽搁没有继续拓展学习,今天就来尝试下本地跑 RAG 来实现更精准有效的检索。

RAG 的基本原理简单来说就几步:

  1. 文本切割后向量化
  2. 基于向量化的结果检索
  3. 将检索的结果交给 LLM 使用

简单看个 Demo
not.png

当我直接运行时,问它 “子擎 Lite” 是什么?,它给我的结果是一个游戏引擎,拼音是 “ZiXin Lite”,很明显是一个胡乱拼凑的假的东西。

但当我去米物百科把“子擎 Lite”的详细信息喂给它时,它就可以准确的描述出相关信息,并总结后告诉我是什么。

had.png

文本向量化:

// 准备的知识库
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 入手,从一个角开始,一步步的去了解整个体系。

本文链接:https://note.lilonghe.net/post/try-local-llm-with-rag.html

-- EOF --