RAG系统加载文件

一、RAG加载文件一般包含4个步骤

  1. 加载文件(读取PDF / TXT / MD / DOCX)
  2. 拆分文本(切分成小块)
  3. 向量化(向量化模型生成向量)
  4. 存入向量库(Chroma / FAISS)

二、示例

安装依赖

pip install langchain langchain-ollama langchain-chroma pypdf python-dotenv

完整示例

# 1. 导入需要的包
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

# 根据后缀自动选择加载器
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】创建检索器 =====
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("""
根据下面的上下文回答问题,不要编造内容。

上下文:{context}
问题:{question}

回答:
""")

# 本地 LLM
llm = ChatOllama(model="qwen:7b")  # 你本地的聊天模型

# 构建 RAG 链
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

# 测试提问
question = "这份文件讲了什么内容?"
answer = rag_chain.invoke(question)
print("答案:", answer)

三、支持哪些文件?

LangChain几乎支持所有文件:

  • .txt → TextLoader
  • .pdf → PyPDFLoader
  • .md → MarkdownLoader
  • .docx → DocxLoader
  • .csv → CSVLoader
  • .json → JSONLoader
  • .excel → UnstructuredExcelLoader
  • 网页、YouTube、Notion、GitHub 等

四、关键点

1. 必须拆分文本

大文件不能直接给 LLM,会超限,必须切成 300~800 字符的小块。

2. 必须向量化

用向量化模型把文本变成向量,才能做相似度检索。

3. 必须存入向量库

Chroma / FAISS 都是本地轻量向量库,不用数据库,直接存文件夹。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容