用DeepSeek+Langchain实现你自己的RAG系统

B站影视 港台电影 2025-03-08 20:49 1

摘要:前面我已经花了很长时间通过Dify等各种开发平台来搭建自己的RAG系统。总想通过自己的程序的来实现,了解它背后的实现原理。最近半个月就一直在研究此事,总算能运行成功了。

前面我已经花了很长时间通过Dify等各种开发平台来搭建自己的RAG系统。总想通过自己的程序的来实现,了解它背后的实现原理。最近半个月就一直在研究此事,总算能运行成功了。

技术栈:Python+Langchain+Ollama+Chroma+DeepSeek+CoROM文本向量模型

Python、Ollama、Chroma、DeepSeek怎么本地安装,查看我之前的文章,这里就不再介绍了。coROM中文通用文本表示模型,作用就是将分割的文本内容,计算其对应的文本向量。在魔搭社区可以下载,具体怎么使用,上面也有介绍,但要下载ModelScope依赖,下载后将模型文件夹解压到同代码一个目录。

一、安装各种依赖包

pip install numpy addict datasets oss2 torch pillow simplejson sortedcontainers modelscope transformers uuid langchain chromadb

由于上面安装的内容比较多,有的包比较大,如有安装失败情况,请多试几次。实在不行,就一个个分开安装。还有我之前已经安装过部分的包,如果上面没有写上,大家根据代码提示,自行安装吧。

二、实现流程

读取文档localDocument = TextLoader('C:\\Python\\example.txt',encoding='utf-8').load

上面的文章目录和地址,自己根据实际情况进行修改。

分割文档text_splitter=CharacterTextsplitter(chunk_size=500,chunk_overlap=0)splitDocument1=text_splitter.split_documents(localDocument)

CharacterTextSplitter‌是LangChain提供的一种工具,用于基于字符的文本分割。它可以将长文本分割成较小的段落或部分,特别适合处理大型文本数据,使其更易于管理和处理。初始化后,用CharacterTextSplitter对localDocument进行处理。

初始化文本向量工具embeddings=ModelScopeEmbeddings(model_id="damo/nlp_corom_sentence-embedding_chinese-base")

ModelScopeEmbeddings‌是一个将文本转换为嵌入向量的工具,首先导入ModelScopeEmbeddings类,然后设置模型ID并初始化嵌入对象。我这里用上面说的coROM中文通用文本表示模型。

存储到Chroma# 初始化Chroma向量存储db = Chroma(collection_name="example_collection",embedding_function=embeddings,persist_directory="./persist_db", # 保存数据到本地)# 添加文档db.add_documents(documents=documents, ids=uuids)# 查询向量库query="XXXXX"search=db.similarity_search(query,k=2)print(search)连接大模型model = Ollama(base_url='http://localhost:11434',model="deepseek-r1:1.5b")qa = vectorDBQA.from_chain_type(llm=model, chain_type="stuff", Vectorstore=db)result = qa.run(query)

chain_type设置为stuff,那么文档块的内容是直接拼接在一起放到{context}。还有 map_reduce、refine、map_rerank等chain_type,可以查询LangChain文档了解具体的使用情景。

三、完整实现代码

from langchain.document_loaders import TextLoaderfrom langchain.embeddings import ModelScopeEmbeddingsfrom langchain.text_splitter import CharacterTextSplitterfrom langchain.vectorstores import Chromafrom langchain.llms import Ollamafrom langchain.chains import VectorDBQAfrom uuid import uuid4import chromadblocalDocument = TextLoader('C:\\Python\\example.txt',encoding='utf-8').loadtext_splitter=CharacterTextSplitter(chunk_size=500,chunk_overlap=0)splitDocument1=text_splitter.split_documents(localDocument)documents=splitDocument1uuids = [str(uuid4) for _ in range(len(documents))]print("documents nums:",documents.__len__)embeddings=ModelScopeEmbeddings(model_id="damo/nlp_corom_sentence-embedding_chinese-base")client = chromadb.HttpClient(host='localhost', port=8000)db = Chroma(collection_name="example_collection",embedding_function=embeddings,client=client, persist_directory="./persist_db", # 保存数据到本地)db.add_documents(documents=documents, ids=uuids)model = Ollama(base_url='http://localhost:11434',model="deepseek-r1:1.5b")qa = VectorDBQA.from_chain_type(llm=model, chain_type="stuff", vectorstore=db)result = qa.run(query)print(result)

以上内容本人已经测试可以运行,由于个人能力有限,要是有啥不对的地方,各位厉害的大神多批评指正!大家一起多交流。

来源:AI创造社

相关推荐