非结构化文档索引构建
将非结构化文档转换为可高效检索的结构化知识库。整个过程遵循“分而治之”的策略:大文档 → 小片段 → 数值向量 → 相似性检索。
建立索引
-
读取文本/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(): 批量处理文档列表,效率更高
输出

文本块/向量
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}
总结
- 读取:将静态文档解析为结构化的文本单元
- 分割:优化信息粒度,平衡完整性与检索精度
- 向量化:将语义信息映射到数学空间
- 存储:构建高效检索的数据结构

浙公网安备 33010602011771号