非结构化文档索引构建

将非结构化文档转换为可高效检索的结构化知识库。整个过程遵循“分而治之”的策略:大文档 → 小片段 → 数值向量 → 相似性检索。

建立索引

  • 读取文本/PDF

  • 分割文本 分割为文本段/chunk

  • 向量化: 对每一段文本段向量化;在这里引入向量模型,

  • 存储: 把多个文本段/向量 存入向量数据库

实践

将PDF文件加载为结构化的文档对象列表
1. PyPDFLoader使用PyPDF2或pdfplumber库解析PDF二进制结构
2. 按页面边界将PDF分解为独立单元
3. 提取每页的文本内容,同时保留格式信息(如换行符)
4. 为每个页面创建Document对象,包含:
- page_content: 页面文本内容(字符串)
- metadata: 元数据字典,包含:
* source: 文件路径
* page: 页码(从0开始)

读取pdf

from langchain_community.document_loaders import PyPDFLoader
def loader_pdf(file_path):
    loader=PyPDFLoader(file_path) //加载pdf
    documents=loader.load() // 把pdf 加载为 List[DOcument] 按页分
    return documents // 内容在page_content ,meatdata: 源信息

分割

将长文档分割为适当大小的文本块,优化后续检索效果

from langchain_text_splitters import RecursiveCharacterTextSplitter

def split_text(documents):
    text_splitter=RecursiveCharacterTextSplitter(
    chunk_size=1000, #每个块的大小
    chunk_overlap=200, #每个块的overlap,用于合并块
    add_start_index=True, #是否添加起始索引
    separators=["\n\n", "\n", " ", ""] #分隔符
    )
    texts=text_splitter.split_documents(documents) ## List[Document] 
    return texts

原始文档(1500字符):
"第一章:机器学习基础...(内容)...本章介绍了机器学习的基本概念..."

分割后:
块1(0-1000字符): "第一章:机器学习基础...(部分内容)..."
块2(800-1500字符): "(重叠部分)...本章介绍了机器学习的基本概念..."

元数据示例:
块1: {'source': 'sample.pdf', 'page': 0, 'start_index': 0}
块2: {'source': 'sample.pdf', 'page': 0, 'start_index': 800}

向量化数据

利用ollama 向量化数据 其中一页数据( 取page_content);文本映射到语义空间

from langchain_ollama import OllamaEmbeddings
def embed_text(texts):
    embeddings=OllamaEmbeddings(model="nomic-embed-text:latest")
    vector_0=embeddings.embed_query(texts[0].page_content) #  输入字符串文本  
    return vector_0
两种嵌入方法:
        - embed_query(): 处理单个查询文本(如用户问题)
        - embed_documents(): 批量处理文档列表,效率更高

输出
image

文本块/向量

from langchain_chroma import Chroma
def create_chroma(texts):
    embeddings=OllamaEmbeddings(model="nomic-embed-text:latest")
    vector_store=Chroma(
        collection_name="snfm",
        embedding_function=embeddings,
        persist_directory="./chroma_db"
    )
    vector_store.add_documents(texts)
    return vector_store
add_documents()触发

a. 遍历所有Document对象
b. 对每个page_content调用embedding_function生成向量
c. 存储三元组: {id, embedding, metadata+content}

总结

  • 读取:将静态文档解析为结构化的文本单元
  • 分割:优化信息粒度,平衡完整性与检索精度
  • 向量化:将语义信息映射到数学空间
  • 存储:构建高效检索的数据结构
posted @ 2026-01-12 00:17  MyKai  阅读(11)  评论(0)    收藏  举报