RAG 实操教程:基于 LangChain 与 Llama2 构建个人 LLM 应用
本文将逐步指导您创建自己的 RAG(检索增强生成)系统,使您能够上传自己的 PDF 文件并向 LLM 询问有关 PDF 的信息。本教程侧重于核心流程,即暂时不涉及 Gradio 前端交互。相关技术栈包括以下内容:
- LLM:
Llama2 - LLM API:
llama.cpp service - Langchain
- Vector DB:
ChromaDB - Embedding:
sentence-transformers
核心在于 LangChain,它是用于开发由语言模型支持的应用程序的框架。LangChain 就像胶水一样,有各种接口可以连接 LLM 模型与其他工具和数据源。以下我将使用最简单的方式示范完整流程。
步骤 1. 环境设置
首先设置 Python 环境,建议使用 conda 创建独立环境,并安装以下库。示例在 Jupyter 环境中完成。
# python=3.9
ipykernel
ipywidgets
langchain
PyMuPDF
chromadb
sentence-transformers
llama-cpp-python
注意:llama-cpp-python 可能需要编译依赖,请确保已安装 C++ 编译器及相应工具链。
步骤 2. 读入文件处理并导入数据库
首先我们要将外部信息处理后,放到 DB 中,以供之后查询相关知识。这一步对应文本拆分器(Text Splitter)和 Embedding 过程。
a). 使用文件加载器
LangChain 提供了很多文件加载器,包括 Word、CSV、PDF、Google Drive、Youtube 等。这里我创建一个虚拟人物 Alison Hawk 的 PDF 信息,并使用 PyMuPDFLoader 读取。请注意需要安装 PyMuPDF 才能使用。
from langchain.document_loaders import PyMuPDFLoader
loader = PyMuPDFLoader("LangChain/Virtual_characters.pdf")
PDF_data = loader.load()
b). 文本分割
文本分割器会将文档或文字分割成一个个 chunk,用以预防文档的信息超过 LLM 的 tokens。LangChain 提供两种主要方式:
RecursiveCharacterTextSplitter: 递归字符分割,默认推荐。CharacterTextSplitter: 简单字符分割。
关键参数如下:
chunk_size: 决定分割文字时每个内存块中的最大字符数。chunk_overlap: 决定分割文字时连续内存块之间重叠的字符数,避免语义被拆分后不完整。
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=)
all_splits = text_splitter.split_documents(PDF_data)


