快速结论:这个报错通常出现在你调用 VectorStore.add_texts 或 aadd_texts 并直接传入 generator(生成器表达式)时,LangChain 会先把生成器消费完用于长度校验,然后又去遍历同一个已耗尽的生成器来构建 Document,导致实际没有任何文档被写入。优先检查传入的 texts 是否为一次性可迭代对象,并改用 list(...) 显式物化。
适用环境:Issue 中确认的环境为 macOS(Darwin,Apple Silicon ARM64)、Python 3.11.13、langchain-core。未提供 CUDA、PyTorch、显卡等信息,不要假设存在这些依赖。
最快修复方案:在调用 add_texts / aadd_texts 前先把生成器转成 list,即 store.add_texts(list(text for text in ...))。这是 Issue 中验证过的规避方式(列表输入走 texts_ 的同一路径不会触发耗尽问题)。
注意事项:把生成器转成 list 会一次性占用内存,超大规模文本流需自行评估;Issue 中建议的源码级修复(把 zip(texts, ...) 改成 zip(texts_, ...))属于 langchain-core 内部改动,需要等官方合并版本,不要自行手工 patch。
问题场景
在 LangChain 中自定义(或使用默认实现)的 VectorStore 子类,调用默认的 add_texts 或 aadd_texts,并直接把生成器表达式(generator expression)作为 texts 参数传入时触发。Issue 中的最小复现使用一个 RecordingVectorStore,调用 store.add_texts((text for text in ["alpha", "beta"])),期望写入 2 个文档,实际写入 0 个。该问题同时影响同步 add_texts 和异步 aadd_texts 两条路径。
报错原文
VectorStore.add_texts exhausts generator inputs before creating documents
assert [doc.page_content for doc in store.documents] == ["alpha", "beta"]
AssertionError
# 复现时本地测试表现为(评论中提及):
assert 0 == 2
此问题不会抛出显式异常,而是静默返回空结果:没有添加任何文档,返回值也为空。若沿用 Issue 中的断言,则表现为 AssertionError。
原因分析
在默认的 add_texts / aadd_texts 实现(libs/core/langchain_core/vectorstores/base.py)中,代码会先把非 list/tuple 的输入物化以校验 metadatas 长度:
texts_: Sequence[str] = texts if isinstance(texts, (list, tuple)) else list(texts)
if metadatas and len(metadatas) != len(texts_):
...
但随后构建 Document 列表时,仍然引用的是原始的 texts:
docs = [
Document(id=id_, page_content=text, metadata=metadata_)
for text, metadata_, id_ in zip(texts, metadatas_, ids_, strict=False)
]
对于生成器而言,第一次 list(texts) 已经把它完全消费,zip(texts, ...) 此时看到的是空迭代器,于是 docs 为空列表。因为传给 add_documents / aadd_documents 的是空列表,所以没有任何文档被写入,也不会抛错。这是 langchain-core 默认实现的逻辑缺陷,属于“可能原因”已被 Issue 讨论链明确确认的根因。
环境排查
- 确认
langchain-core版本:该缺陷存在于默认VectorStore.add_texts/aadd_texts实现中,需确认你的版本尚未包含修复。 - 确认
texts的传入类型:是否为生成器、map对象、filter对象等一次性可迭代对象。若是 list 或 tuple,则不会触发此问题。 - 确认
metadatas与ids是否也以生成器形式传入;即使它们具有__len__,物化逻辑主要针对texts。 - 确认你的自定义
VectorStore子类是否复用默认的add_texts,还是自行覆写。Issue 中复现是复用默认实现。 - Issue 中确认环境为 macOS (Darwin ARM64)、Python 3.11.13;CUDA / PyTorch / 显卡信息未提供,无需检查。
解决步骤
- 最快的绕过方式:调用前把生成器显式转成 list。例如:
texts = [text for text in ["alpha", "beta"]] store.add_texts(texts)或
store.add_texts(list(text_gen))这样传入的是 list,物化分支不会消费源生成器,后续
zip(texts, ...)能正常迭代。 - 若你维护着自己的
langchain-core分支:把add_texts和aadd_texts中的zip(texts, ...)改为zip(texts_, ...),即使用已物化的序列来构建Document。这是 Issue 讨论中给出的建议修复方向,共两处、每处一个 token。 - 若你依赖官方版本:等待包含此修复的
langchain-core发布后再升级,不要长期本地手工 patch。 - 若你是库作者并可提交 PR:可在
libs/core/tests/unit_tests/vectorstores/test_vectorstore.py中为test_default_add_texts与test_default_aadd_texts增加生成器输入的回归用例,断言写入文档数为 2 且内容为["alpha", "beta"],覆盖同步与异步两条路径。
验证方法
用 Issue 中的最小复现脚本验证:定义一个实现 add_documents 并记录文档的子类,传入生成器表达式,断言 [doc.page_content for doc in store.documents] == ["alpha", "beta"]。异步路径同理,检查 aadd_texts 后记录到的文档内容。若走了源码修复,应同时确认 add_texts 与 aadd_texts 均通过,且未引入其他回归。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: Kimi-K3-NVFP4 on 8xB300 produces degenerate, incoherent output in the reasoning channel on v0.27.0](https://www.chat-gpts.plus/wp-content/uploads/2026/09/51798-e8ba3af0-768x403.jpg)

