You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:40:12