使用 LangChain 和 DeepSeek 构建智能 RAG 知识库系统

🔍 使用 LangChain 和 DeepSeek 构建智能 RAG 知识库系统

在当今数据爆炸的时代 ,如何高效地从海量文档中提取关键信息成为了一个重要挑战。检索增强生成(Retrieval-Augmented Generation,简称 RAG)技术应运而生,它结合了检索系统的精准性和大语言模型的生成能力,为我们提供了一个强大的解决方案 。

由于DeepSeek 不支持 Langchain的OpenAI Embedding 接口的情况下,于是探索了引入其他的Embedding模型来读取文档存入向量数据库,以间接实现知识检索与问答能力 。

本教程将带您一步步探索如何利用 LangChain 框架和 DeepSeek 大语言模型构建一个功能完备的 RAG 知识库系统 。

1. 环境准备:搭建您的基础设施 🛠️

首先,我们需要准备好必要的工具库。这些库就像是我们的工具箱,每一个都有其特定的用途:

import os
from dotenv import load_dotenv, find_dotenv
from langchain_openai import ChatOpenAI
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain_community.document_loaders import PyMuPDFLoader, UnstructuredMarkdownLoader
from langchain_huggingface import HuggingFaceEmbeddings

这些库的作用分别是:

  • os:处理文件和目录操作
  • dotenv:管理环境变量,确保 API 密钥等敏感信息安全存储
  • langchain 系列组件:提供文档处理、向量化、存储和检索的核心功能
  • PyMuPDFLoaderUnstructuredMarkdownLoader:处理 PDF 和 Markdown 格式文档
  • HuggingFaceEmbeddings:提供文本向量化能力

2. API 配置:连接 DeepSeek 的桥梁 🌉

就像您需要钥匙才能打开门一样,我们需要 API 密钥来访问 DeepSeek 的强大能力:

# 配置 API 设置
DEEPSEEK_API_KEY = "your-api-key"
DEEPSEEK_API_BASE = "https://api.deepseek.com/v1"

请务必将您的实际 API 密钥替换到上面的代码中,同时确保不要在公开场合分享您的密钥 🔒。最佳实践是使用环境变量或配置文件来存储这些敏感信息。

3. 文档加载和处理:准备您的知识源 📝

3.1 设置文档目录 📂

首先,我们需要明确文档的存放位置,并确保该目录存在:

# 设置文档文件夹路径
folder_path = './data_base/kowlege_db'

# 确保目录存在
os.makedirs(folder_path, exist_ok=True)

# 获取所有文档路径
file_paths = []
for root, dirs, files in os.walk(folder_path):
    for file in files:
        file_path = os.path.join(root, file)
        file_paths.append(file_path)

# 检查是否找到文档
if not file_paths:
    print("No documents found in the specified directory.")
else:
    print(f"Found {len(file_paths)} documents to process.")

这段代码就像是一位图书管理员 ,它首先确认书架(目录)是否存在,然后仔细地检查每一本书(文件),并记录下它们的确切位置(路径)。如果书架上空空如也,它会告诉我们没有找到任何书籍。

3.2 加载文档 📄

接下来,我们需要"阅读"这些文档的内容:

# 加载文档
documents = []
for file_path in file_paths:
    file_type = file_path.split('.')[-1].lower()
    if file_type == 'pdf':
        loader = PyMuPDFLoader(file_path)
    elif file_type == 'md':
        loader = UnstructuredMarkdownLoader(file_path)
    else:
        print(f"Unsupported file type: {file_type}")
        continue
    
    # 加载文档内容
    documents.extend(loader.load())

print(f"Loaded {len(documents)} documents.")

在这个阶段,我们就像是在翻阅不同类型的书籍 。对于 PDF 格式的"书籍",我们使用 PyMuPDFLoader 这个"阅读器";对于 Markdown 格式的"书籍",我们则使用 UnstructuredMarkdownLoader。每当我们遇到不支持的格式,我们会跳过它并记录下来。最终,我们会得到所有文档的内容合集。

3.3 文档分块 ✂️

大型文档就像是厚重的百科全书,一次阅读完整本是很困难的。因此,我们需要将它们分成更小的章节:

# 拆分文档
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,
    chunk_overlap=50
)
split_docs = text_splitter.split_documents(documents)

print(f"Documents split into {len(split_docs)} chunks.")

这里,我们使用了 RecursiveCharacterTextSplitter 这个"智能分割工具",它能将长文档分割成大小适中的片段。chunk_size=500 表示每个片段约含 500 个字符,而 chunk_overlap=50 则确保相邻片段之间有 50 个字符的重叠,这样可以保持上下文的连贯性,避免重要信息在分割处被截断 。

4. 向量化和存储:构建您的知识地图 🗺️

文本向量化是 RAG 系统的核心步骤,它就像是为每段文本创建一个"地图坐标",让我们能够在后续检索时快速定位相关内容:

# 设置向量存储路径
persist_directory = './data_base/vector_db/chroma'
os.makedirs(persist_directory, exist_ok=True)

# 初始化嵌入模型
embeddings = HuggingFaceEmbeddings(
    model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"
)

# 创建向量存储
vectorstore = Chroma.from_documents(
    documents=split_docs,
    embedding=embeddings,
    persist_directory=persist_directory
)

print("Vector store created and persisted.")

在这个阶段,我们使用了 HuggingFace 的多语言模型 paraphrase-multilingual-MiniLM-L12-v2 来生成文本嵌入 。这个模型就像是一位精通多种语言的翻译家,它能够理解文本的语义,并将其转化为计算机可以处理的数字向量。

而 Chroma 则是我们选择的向量数据库 ,它就像是一个高效的图书索引系统,不仅能够存储这些向量,还能在后续检索时迅速找到相似的内容。我们将这个"索引系统"持久化存储在指定目录中,这样即使程序重启,也不需要重新生成向量。

5. 配置 LLM 和问答链:连接您的智能问答系统 🧩

现在,我们需要设置大语言模型(LLM)并创建检索问答链,这是整个系统的"大脑"部分:

# 初始化 DeepSeek LLM
llm = ChatOpenAI(
    model="deepseek-chat",
    openai_api_key=DEEPSEEK_API_KEY,
    openai_api_base=DEEPSEEK_API_BASE,
    max_tokens=1024,
    temperature=0.7,
    default_headers={"Authorization": f"Bearer {DEEPSEEK_API_KEY}"}
)

print("DeepSeek LLM initialized.")

# 创建检索链
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever(search_kwargs={"k": 1}),
    return_source_documents=True,
)

print("Retrieval QA chain created.")

在这里,我们初始化了 DeepSeek 的大语言模型作为我们系统的"思考引擎" 。max_tokens=1024 控制了回答的最大长度,而 temperature=0.7 则调节了回答的创造性与确定性之间的平衡——较高的温度会产生更多样化但可能不太精确的回答,较低的温度则会产生更确定但可能不太灵活的回答。

接着,我们创建了检索问答链(RetrievalQA)⛓️。这里的 chain_type="stuff" 表示我们使用了"stuffing"策略,即将所有检索到的上下文一次性提供给模型。而 search_kwargs={"k": 1} 则指定每次检索返回最相关的 1 个文档片段。return_source_documents=True 确保我们能够追踪答案的来源,这对于知识库系统的可信度至关重要 。

6. 测试系统:见证您的 RAG 系统成果 🎯

最后,让我们通过一个实际的查询来测试我们的 RAG 系统:

# 示例查询
query = "请总结一下文档中的主要内容"
print("\nProcessing query:", query)

# 使用 invoke() 执行查询
result = qa_chain.invoke({"query": query})

# 输出结果
print("\nAnswer:", result["result"])
print("\nSource Documents:")
for doc in result["source_documents"]:
    print(f"\nSource: {doc.metadata['source']}")
    print(f"Content: {doc.page_content[:200]}...")

在这个测试中,我们向系统提出了一个问题:“请总结一下文档中的主要内容” 。系统会处理这个查询,从向量库中检索最相关的内容,然后利用 DeepSeek 模型生成一个综合的答案。最后,我们不仅展示了答案,还展示了这个答案所基于的文档来源,这大大增强了系统回答的可信度和可追溯性 ✅。

实际输出示例 📋

运行以上代码后,我们得到了如下输出结果:

Processing query: 请总结一下文档中的主要内容

Answer: 文档主要讲述了开发者小明在信息时代面临的文本信息处理挑战,以及他如何利用大型语言模型(LLM)的文本摘要功能来提高效率。通过LLM,小明能够快速从大量文献中提取关键信息,而不需要阅读所有文档。他通过编程调用API接口实现了这一功能,并感叹这一技术如同魔法般将复杂的信息简化为清晰的关键点。文档强调了LLM文本摘要功能的优势,包括节省时间、提高效率和精准获取信息,并介绍了如何通过编程和调用API接口来掌握这一工具。

Source Documents:

Source: ./data_base/kowlege_db\文本转换.md
Content: 在繁忙的信息时代,小明是一名热心的开发者,面临着海量的文本信息处理的挑战。他需要通过研究无数的文献资料来为他的项目找到关键的信息,但是时间却远远不够。在他焦头烂额之际,他发现了大型语言模型(LLM)的文本摘要功能。 这个功能对小明来说如同灯塔一样,照亮了他处理信息海洋的道路。LLM 的强大能力在于它可以将复杂的文本信息简化,提炼出关键的观点,这对于他来说无疑是巨大的帮助。他不再需要花费大量的时间...

从这个示例中,我们可以看到系统成功地从文档中提取了关键信息并生成了一个简洁明了的摘要 。同时,它还提供了信息的来源,使用户能够追溯到原始文档进行更深入的阅读。

参考资源:深入学习和探索 📚

### 如何使用 DeepSeek 构建本地 RAG 知识库 为了构建一个基于 DeepSeek 的本地 RAG (检索增强生成) 知识库,可以采用如下方法: #### 准备工作环境 确保安装了必要的 Python 库,如 `deepseek` 其他支持工具。 ```bash pip install deepseek langchain faiss-cpu gradio ``` #### 加载并初始化 DeepSeek 模型 加载指定版本的 DeepSeek 模型用于后续处理查询请求。 ```python from deepseek import DeepSeek # 初始化DeepSeek模型 deepseek_model = DeepSeek('1.3B') ``` #### 文档预处理与分割 对输入文档进行分词切片操作以便于索引建立。这里假设已经有一个包含多个文档的对象 `documents`。 ```python from langchain.text_splitter import CharacterTextSplitter text_splitter = CharacterTextSplitter(separator="\n\n", chunk_size=1000, chunk_overlap=200) split_docs = text_splitter.split_documents(documents) ``` #### 创建向量数据库 利用 FAISS 或相似技术创建高效的向量存储结构来保存经过嵌入转换后的文本片段。 ```python from langchain.vectorstores.faiss import FAISS from langchain.embeddings.huggingface import HuggingFaceEmbeddings embedder = HuggingFaceEmbeddings() vector_store = FAISS.from_documents(split_docs, embedder) ``` #### 实现问答功能 通过集成上述组件实现完整的问答流程,包括从用户接收问题、执行搜索以及最终返回答案。 ```python def generate_response(query): # 执行语义搜索获得最相关的几个文档作为背景信息 docs = vector_store.similarity_search(query) # 提取这些文档的内容形成上下文字符串 context = " ".join([d.page_content for d in docs]) # 调用 DeepSeek 生成最终回复 response = deepseek_model.generate(query=query, context=context) return response ``` 此过程展示了如何结合 DeepSeek 及其相关模块,在本地环境中设置一套有效的 RAG 系统[^1]。该方案不仅能够高效地管理检索大量非结构化数据,还能借助强大的自然语言理解能力提供精准而流畅的回答[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值