LangChain智能文档助手【2】-文档加载器
·
这是一个基于 LangChain 框架和通义千问(Qwen)大语言模型构建的检索增强生成(RAG)智能问答系统的教程。该系统是基于最基础的功能点,如大语言模型调用,文档处理,嵌入模型向量化,向量存储和检索,智能对话构建而成,最后用streamlit生成一个web界面,将功能可视化。
第二章 文档加载器
本章要构建的是一个文档加载和处理工具,参考如下代码层级,创建文件document_loader.py。

document_loader.py文件的完整代码如下:
# 文件: document_loader.py
import os
from dotenv import load_dotenv
from langchain_community.document_loaders import PyPDFLoader, TextLoader, UnstructuredFileLoader
load_dotenv()
def load_documents(file_path):
"""加载文档 - 支持更多格式"""
# 获取文件扩展名
_, ext = os.path.splitext(file_path.lower())
loader_map = {
'.pdf': PyPDFLoader,
'.txt': lambda path: TextLoader(path, encoding='utf-8'),
'.md': lambda path: TextLoader(path, encoding='utf-8'),
'.docx': UnstructuredFileLoader,
'.pptx': UnstructuredFileLoader,
}
try:
if ext not in loader_map:
raise ValueError(f"不支持的文件格式: {ext}")
print(f"📚 正在加载文档: {file_path}")
# 加载文档
loader = loader_map[ext](file_path)
documents = loader.load()
print(f"✅ 成功加载 {len(documents)} 个文档块")
# 显示统计信息
total_chars = sum(len(doc.page_content) for doc in documents)
print(f"📊 总字符数: {total_chars}")
# 显示第一个文档内容预览
if documents:
preview = documents[0].page_content[:300]
print(f"\\n📄 内容预览:\\n{preview}...")
print(f"🏷️ 元数据: {documents[0].metadata}")
return documents
except Exception as e:
print(f"❌ 加载文档时出错: {e}")
return None
def create_sample_documents():
"""创建示例文档(如果不存在)"""
if not os.path.exists("docs"):
os.makedirs("docs")
# 创建包含Qwen相关信息的示例文档
sample_content = """通义千问(Qwen)是阿里巴巴达摩院开发的大语言模型。
主要特点:
1. 强大的中文理解能力
2. 支持多种文件格式处理
3. 提供多种模型规格:Qwen-Plus, Qwen-Max, Qwen-Turbo
4. 支持128K长上下文
LangChain框架可以方便地集成Qwen模型。
通过DashScope API,开发者可以轻松调用Qwen的各种能力。
向量数据库(Vector Database)用于存储文档的嵌入向量。
相似性搜索(Similarity Search)可以快速找到相关文档片段。
检索增强生成(RAG)结合了检索和生成的优势。
它先检索相关文档,再基于这些文档生成答案。"""
# 保存为TXT文件
txt_path = "docs/qwen_intro.txt"
with open(txt_path, "w", encoding="utf-8") as f:
f.write(sample_content)
print(f"📝 已创建示例文档: {txt_path}")
return txt_path
# 测试代码
if __name__ == "__main__":
from qwen_client import QwenClient
# 测试Qwen连接
qwen = QwenClient()
qwen.test_connection()
# 创建或加载文档
sample_file = create_sample_documents()
# 加载文档
docs = load_documents(sample_file)
if docs:
# 测试用Qwen总结文档
print("\\n🧠 使用Qwen总结文档内容...")
content_preview = docs[0].page_content[:500]
summary = qwen.chat_completion([
{"role": "system", "content": "你是一个文档总结助手"},
{"role": "user", "content": f"请用一句话总结以下文档内容:\\n{content_preview}"}
])
print(f"📋 文档总结: {summary}")
运行代码
python src/document_loader.py
代码运行结果如下:

代码解析:
- 源代码块
# 加载文档
loader = loader_map[ext](file_path)
documents = loader.load()
print(f"✅ 成功加载 {len(documents)} 个文档块")
# 显示统计信息
total_chars = sum(len(doc.page_content) for doc in documents)
print(f"📊 总字符数: {total_chars}")
这里的documents是 LangChain 提供的Document类实例的列表。
# document的主要属性
- page_content: str # 文档的实际内容
- metadata: dict # 包含来源、页码等信息的字典
元数据metadata的常见字段
# 不同文档类型的metadata示例
{
# PDF文档
'source': 'docs/report.pdf', # 文件路径
'page': 5, # 页码(从0或1开始)
'total_pages': 20, # 总页数
# Word文档
'author': '张三',
'created_date': '2024-01-15',
'modified_date': '2024-01-20',
# 网页内容
'url': 'https://example.com',
'title': '文章标题',
'description': '文章描述'
}
2. 三种文档加载器的比较:PyPDFLoader,TextLoader,UnstructuredFileLoader

以上内容完成,我们就成功加载了文档。接下来我们需要做文档分割。
更多推荐



所有评论(0)