Langchain TextLoader异常:ChromaDB仅处理首个文档且文本分割失效求助
问题解决方案
核心问题分析
- 文本分割器未生效:代码中缺失将加载后的文档传入分割器执行分割的步骤,且直接使用了未定义的
texts变量,导致整个文档被当作单个块存入Chroma,因此出现块大小远超300的提示。 - 后续文档无法检索:每次运行仅加载单个文件,且
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
相关产品推荐
相关产品推荐

