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

Langchain TextLoader异常:ChromaDB仅处理首个文档且文本分割失效求助

问题解决方案

核心问题分析

  1. 文本分割器未生效:代码中缺失将加载后的文档传入分割器执行分割的步骤,且直接使用了未定义的texts变量,导致整个文档被当作单个块存入Chroma,因此出现块大小远超300的提示。
  2. 后续文档无法检索:每次运行仅加载单个文件,且Chroma.from_documents默认会覆盖已有数据库(或未正确追加文档),同时缺少批量加载文件夹内所有文档的逻辑。

分步修复方案

1. 修复文本分割逻辑

必须在加载文档后调用分割器的split_documents方法生成符合要求的文本块,补充代码中缺失的分割步骤:

loader = TextLoader("./folder/file.txt")
documents = loader.load()
# 执行文本分割,生成符合chunk_size要求的块
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=0)
split_docs = text_splitter.split_documents(documents)

2. 实现文档追加与批量加载

若要加载文件夹内所有TXT文档且后续新增文档可被检索,需:

  • 使用DirectoryLoader批量加载文件夹内所有文件
  • 检查Chroma数据库是否已存在,存在则加载现有库并追加文档,不存在则初始化新库

修正后的完整代码示例:

from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings  # 替换为你实际使用的embeddings模型

# 批量加载folder下的所有TXT文件
loader = DirectoryLoader("./folder", glob="*.txt")
documents = loader.load()

# 执行文本分割
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=0)
split_docs = text_splitter.split_documents(documents)

chroma_directory = "./folder/chroma_db"
embeddings = OpenAIEmbeddings()  # 替换为你的embedding模型

# 处理数据库的加载与追加逻辑
try:
    # 加载已存在的Chroma库
    db = Chroma(persist_directory=chroma_directory, embedding_function=embeddings)
    # 追加新分割后的文档
    db.add_documents(split_docs)
except:
    # 数据库不存在时,创建新库并初始化
    db = Chroma.from_documents(split_docs, embeddings, persist_directory=chroma_directory)

# 持久化数据库,确保变更保存
db.persist()

3. 额外注意事项

  • 确保使用的embeddings实例与初始化数据库时完全一致,否则无法正确加载已有库
  • 若仅需添加单个新文档,只需将DirectoryLoader换回TextLoader,其余追加逻辑保持不变
  • 测试前可删除旧的chroma_db目录,验证首次分割与存储是否正常执行

内容的提问来源于stack exchange,提问作者Python12492

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:31:15