一、RAG加載文件一般包含4個步驟
- 加載文件(讀取PDF / TXT / MD / DOCX)
- 拆分文本(切分成小塊)
- 向量化(向量化模型生成向量)
- 存入向量庫(Chroma / FAISS)
二、示例
安裝依賴
pip install langchain langchain-ollama langchain-chroma pypdf python-dotenv
完整示例
# 1. 導(dǎo)入需要的包
from langchain_ollama import OllamaEmbeddings, ChatOllama
from langchain_chroma import Chroma
from langchain_text_splitters import RecursiveCharacterTextSplitter
# ===== 【1】加載文件的核心代碼 =====
from langchain_community.document_loaders import (
TextLoader, # 加載 .txt
PyPDFLoader, # 加載 .pdf
UnstructuredMarkdownLoader # 加載 .md
)
# 選擇你要加載的文件(改這里即可)
FILE_PATH = "test.pdf" # 可以是 txt / md / pdf
# 根據(jù)后綴自動選擇加載器
if FILE_PATH.endswith(".txt"):
loader = TextLoader(FILE_PATH, encoding="utf-8")
elif FILE_PATH.endswith(".pdf"):
loader = PyPDFLoader(FILE_PATH)
elif FILE_PATH.endswith(".md"):
loader = UnstructuredMarkdownLoader(FILE_PATH)
else:
raise ValueError("不支持的文件類型")
# 加載文檔
documents = loader.load()
# ===== 【2】文本拆分(必須做,否則太長LLM吃不消) =====
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每塊大小
chunk_overlap=100, # 重疊,保證上下文連貫
)
splits = text_splitter.split_documents(documents)
# ===== 【3】向量化(你本地的 bge-m3) =====
embedding = OllamaEmbeddings(
model="bge-m3:latest" # 你本地已有的向量模型
)
# ===== 【4】存入向量庫(Chroma 自動本地存儲) =====
vectorstore = Chroma.from_documents(
documents=splits,
embedding=embedding,
persist_directory="./chroma_db" # 存在本地,下次直接加載
)
# ===== 【5】創(chuàng)建檢索器 =====
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
# ======================
# RAG 問答鏈(可直接提問)
# ======================
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# 提示詞
prompt = ChatPromptTemplate.from_template("""
根據(jù)下面的上下文回答問題,不要編造內(nèi)容。
上下文:{context}
問題:{question}
回答:
""")
# 本地 LLM
llm = ChatOllama(model="qwen:7b") # 你本地的聊天模型
# 構(gòu)建 RAG 鏈
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 測試提問
question = "這份文件講了什么內(nèi)容?"
answer = rag_chain.invoke(question)
print("答案:", answer)
三、支持哪些文件?
LangChain幾乎支持所有文件:
-
.txt→ TextLoader -
.pdf→ PyPDFLoader -
.md→ MarkdownLoader -
.docx→ DocxLoader -
.csv→ CSVLoader -
.json→ JSONLoader -
.excel→ UnstructuredExcelLoader - 網(wǎng)頁、YouTube、Notion、GitHub 等
四、關(guān)鍵點
1. 必須拆分文本
大文件不能直接給 LLM,會超限,必須切成 300~800 字符的小塊。
2. 必須向量化
用向量化模型把文本變成向量,才能做相似度檢索。
3. 必須存入向量庫
Chroma / FAISS 都是本地輕量向量庫,不用數(shù)據(jù)庫,直接存文件夾。