1. 文件读取与文档封装 (Document Loading)
将本地的非结构化数据(如 txt)读取出来,并赋予“元数据”(Metadata),这是后续追溯信息来源的关键。
-
对应引入:
from pathlib import Path from langchain_core.documents import Document -
常规操作:
读取纯文本,实例化Document对象。page_content存正文,metadata存出处(如文件名、页码、作者等)。text = file_path.read_text(encoding="utf-8") doc = Document(page_content=text, metadata={"source": file_path.name})
2. 文本切片 (Chunking / Splitting)
大模型有上下文窗口限制,且整篇文档直接向量化会丢失细节。我们需要将长文本切分成合适的块(Chunk)。
-
对应引入:
from langchain_text_splitters import RecursiveCharacterTextSplitter -
常规操作:
设定chunk_size(块大小)和chunk_overlap(块与块之间的重叠字数,防止一句话被生硬截断导致语义丢失),然后执行切分。text_splitter = RecursiveCharacterTextSplitter(chunk_size=50, chunk_overlap=10) split_docs = text_splitter.split_documents(documents)
3. 加载向量化模型 (Embedding)
将人类阅读的自然语言,转换成计算机能理解的高维向量(一串浮点数数组)。语义相近的句子,它们在多维空间中的距离也越近。
-
对应引入:
from langchain_community.embeddings import HuggingFaceBgeEmbeddings -
常规操作:
加载本地或开源的 Embedding 模型(如智源的 BGE 模型是中文领域表现极佳的开源模型)。embedding_model = HuggingFaceBgeEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
4. 向量库构建与检索 (Vector Store & Retrieval)
将切好的 Chunk 和它们对应的向量存入专门的数据库(如 FAISS)。当用户提问时,将问题也向量化,然后去库里计算距离(如余弦相似度),找出最接近的 Chunk。
-
对应引入:
from langchain_community.vectorstores import FAISS -
常规操作:
用文档和模型初始化数据库,并调用similarity_search进行 Top-K 检索。# 建库 vector_db = FAISS.from_documents(split_docs, embedding_model) # 检索 results = vector_db.similarity_search(query, k=1)