基于 LangChain 搭建最小化 RAG 系统实战
检索增强生成(Retrieval-Augmented Generation, RAG)是近年来大模型应用中最核心的技术架构之一。它通过引入外部知识库,有效缓解了大模型的知识幻觉问题。本文将利用 LangChain 框架,从零开始搭建一个最简化的 RAG 系统,解析其核心原理与实现细节。
环境准备
建议使用 Python 3.9+ 环境。LangChain 版本更新较快,建议安装最新稳定版以避免兼容性问题。
主要依赖包包括:
langchain:核心框架chromadb:向量数据库sentence-transformers或huggingface_hub:用于加载 BGE 嵌入模型PyPDF2或unstructured:视数据格式而定
RAG 核心原理
RAG 流程主要分为三个步骤:
- 索引建立:将非结构化文本数据通过向量化模型转换为向量,并存储到向量数据库中。
- 检索:根据用户查询,在向量数据库中查找语义最相关的 Top-K 片段。
- 生成:将检索到的上下文与用户问题拼接成提示词,输入给大语言模型生成最终答案。
该架构的核心在于利用向量相似度匹配解决信息检索的准确性问题,同时利用大模型的生成能力保证回答的自然流畅。
索引建立
我们使用 Chroma 作为轻量级向量数据库,调用 BGE (BAAI General Embedding) 模型完成文本向量化。原始数据采用 Markdown 格式,便于直接使用 TextLoader 加载。
代码实现
import os
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain.embeddings.huggingface import HuggingFaceBgeEmbeddings
# 配置模型路径
BGE_MODEL_PATH = "BAAI/bge-large-zh"
root_dir = "./data" # 替换为你的数据目录
def extract_file_dirs(directory):
file_paths = []
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(".md"):
fp = os.path.join(root, file)
file_paths.append(fp)
file_paths
files = extract_file_dirs(root_dir)
loaders = [TextLoader(f, encoding=) f files]
docs = []
l loaders:
docs.extend(l.load())
text_splitter = RecursiveCharacterTextSplitter(chunk_size=, chunk_overlap=)
documents = text_splitter.split_documents(docs)
embedding = HuggingFaceBgeEmbeddings(model_name=BGE_MODEL_PATH)
vectorstore = Chroma.from_documents(
documents=documents,
embedding=embedding,
persist_directory=
)


