这是一个基于 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

代码运行结果如下:

代码解析:

  1. 源代码
     # 加载文档
        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

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

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐