LangChain RAG检索本地中文TXT内容不全问题及代码优化咨询
解决LangChain RAG中文TXT全内容检索问题
针对你遇到的部分内容无法检索、调整chunk_size后问题内容变化的情况,核心原因是中文文本分割逻辑不匹配、chunk重叠设置缺失/不合理,或是嵌入/检索策略未适配中文场景,以下是具体修改方案:
1. 替换为中文友好的文本分割器
默认的RecursiveCharacterTextSplitter基于英文标点/空格分割,对中文语义断裂的处理很差,会导致部分语义单元被拆分到不同chunk,无法被检索命中。改用中文专属分隔符配置:
from langchain.text_splitter import RecursiveCharacterTextSplitter # 配置中文优先的分割符列表,按优先级从高到低 text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, # 根据你的嵌入模型上下文长度调整 chunk_overlap=200, # 设置合理重叠,避免语义割裂 separators=["\n\n", "\n", "。", "!", "?", ";", ",", " ", ""], length_function=len ) # 分割加载后的文档 split_docs = text_splitter.split_documents(loaded_docs)
2. 强制验证chunk完整性
在分割后遍历所有chunk,拼接后和原文本对比,确认没有内容丢失:
# 验证分割后内容是否完整 combined_text = "".join([doc.page_content for doc in split_docs]) original_text = loaded_docs[0].page_content # 假设是单文件加载 assert combined_text == original_text, "分割后内容丢失,请检查分割器配置"
3. 更换中文适配的嵌入模型
如果使用默认的英文嵌入模型(如OpenAI Embeddings),中文语义编码效果差,会导致检索召回率低。改用开源中文嵌入模型,比如bge-base-zh-v1.5:
from langchain.embeddings import HuggingFaceEmbeddings embeddings = HuggingFaceEmbeddings( model_name="BAAI/bge-base-zh-v1.5", model_kwargs={"device": "cpu"}, # 有GPU可以改成"cuda" encode_kwargs={"normalize_embeddings": True} )
4. 优化检索策略
- 提高检索返回的chunk数量(top_k),避免漏掉相关内容:
from langchain.vectorstores import Chroma db = Chroma.from_documents(split_docs, embeddings) retriever = db.as_retriever(search_kwargs={"k": 10}) # 默认k=4,可根据文档长度调整
- 若文档有长段落,使用父文档检索,先检索小chunk定位,再返回完整的父段落,避免关键信息被拆分:
from langchain.retrievers import ParentDocumentRetriever from langchain.storage import InMemoryStore # 定义父文档分割器(大chunk)和子文档分割器(小chunk用于检索) parent_splitter = RecursiveCharacterTextSplitter(chunk_size=3000) child_splitter = RecursiveCharacterTextSplitter(chunk_size=500) store = InMemoryStore() retriever = ParentDocumentRetriever( vectorstore=db, docstore=store, child_splitter=child_splitter, parent_splitter=parent_splitter, )
完整修改后示例代码
from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import Chroma # 1. 加载文件(确认已加载全内容) loader = TextLoader("your_local_file.txt", encoding="utf-8") loaded_docs = loader.load() # 2. 中文友好分割 text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200, separators=["\n\n", "\n", "。", "!", "?", ";", ",", " ", ""], length_function=len ) split_docs = text_splitter.split_documents(loaded_docs) # 3. 验证分割完整性(可选但推荐) combined_text = "".join([doc.page_content for doc in split_docs]) assert combined_text == loaded_docs[0].page_content, "分割内容丢失" # 4. 中文嵌入模型 embeddings = HuggingFaceEmbeddings( model_name="BAAI/bge-base-zh-v1.5", model_kwargs={"device": "cpu"}, encode_kwargs={"normalize_embeddings": True} ) # 5. 构建向量库与检索器 db = Chroma.from_documents(split_docs, embeddings) retriever = db.as_retriever(search_kwargs={"k": 10}) # 测试检索 query = "你要检索的中文问题" relevant_docs = retriever.get_relevant_documents(query) for doc in relevant_docs: print(doc.page_content)
内容的提问来源于stack exchange,提问作者conceal
相关产品推荐
相关产品推荐

