RAG系統(tǒng)加載文件

一、RAG加載文件一般包含4個步驟

  1. 加載文件(讀取PDF / TXT / MD / DOCX)
  2. 拆分文本(切分成小塊)
  3. 向量化(向量化模型生成向量)
  4. 存入向量庫(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ù)庫,直接存文件夾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容