本文将使用
langgraph
实现一个简单的
RAG(Retrieval Augmented Generation,检索增强生成)
系统。
使用
qwen2.5
、deepseek-r1
以及llama3.1
做实验,用shaw/dmeta-embedding-zh
做中文嵌入和检索。
关于 RAG
RAG(Retrieval Augmented Generation,检索增强生成) 是一种 结合检索(Retrieval
)与 生成(Generation)
的AI技术,用于提升 LLM(大语言模型)
的回答质量。
典型的 RAG
应用程序有两个主要组件:
- 索引:从源中提取数据并对其进行索引。这通常是离线进行的。
- 检索和生成:它在运行时接受用户查询并从索引中检索相关数据,然后将其传递给模型。
索引
- 加载:首先,我们需要加载数据。这可以通过文档加载器完成。
langchain
提供了 html、csv、pdf 等诸多加载器。 - 拆分:文本拆分器将大型文档拆分成较小的块。这对于索引数据和将其传递到模型都很有用,因为大块数据更难搜索,并且不适合模型的有限上下文窗口。
- 存储:我们需要一个地方来存储和索引我们的拆分,以便以后可以搜索它们。这通常使用 VectorStore 和 Embeddings 模型来完成。
检索和生成
- 检索:给定用户输入,使用检索器从存储中检索相关分割后的文档。
- 生成:ChatModel/LLM 使用包含问题和检索到的数据的提示词生成答案。
准备
在正式开始撸代码之前,需要准备一下编程环境。
-
计算机
本文涉及的所有代码可以在没有显存的环境中执行。 我使用的机器配置为:- CPU: Intel i5-8400 2.80GHz
- 内存: 16GB
-
Visual Studio Code 和 venv
这是很受欢迎的开发工具,相关文章的代码可以在Visual Studio Code
中开发和调试。 我们用python
的venv
创建虚拟环境, 详见:
在Visual Studio Code中配置venv。 -
Ollama
在Ollama
平台上部署本地大模型非常方便,基于此平台,我们可以让langchain
使用llama3.1
、qwen2.5
、deepseek
等各种本地大模型。详见:
在langchian中使用本地部署的llama3.1大模型 。
创建矢量数据库对象
我们直接使用之前使用 chroma
创建好的本地嵌入数据库,它的数据源是一个 csv 文件,每一行包含了一种动物的信息,例如:
名称,学名,特点,作用
狗,Canis lupus familiaris,忠诚、聪明、社交性强,看家护院、导盲、搜救、警务、情感陪伴
猫,Felis catus,独立、高冷、善于捕鼠,消灭害鼠、陪伴、缓解压力
详细的创建过程可参见:本地大模型编程实战(14)初探智能体Agent(1)
embed_model_name = "shaw/dmeta-embedding-zh"
vector_store = Chroma(persist_directory=get_persist_directory(embed_model_name)