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

使用LangChain+Chroma检索器时出现'dict' object has no attribute 'replace'错误的排查与优化咨询

使用LangChain+Chroma检索器时出现'dict' object has no attribute 'replace'错误的排查与优化咨询

一、错误原因与修复方案

这个错误的核心问题出在你链中RunnablePassthrough()的使用方式上,我来拆解一下:

当你调用review_chain.invoke({"question": query})时,RunnablePassthrough()会把完整的输入字典(也就是{"question": query}这个字典)直接传递给链的question字段,而不是提取里面的query字符串。后续prompt渲染过程中,代码会尝试对这个字典调用字符串的replace方法,自然就会抛出'dict' object has no attribute 'replace'的错误。

快速修复

把链中RunnablePassthrough()替换成专门提取question字段的逻辑就行:

# 修正后的链定义
review_chain = (
  {
    "context": reviews_retriever | (lambda docs: "\n".join([doc.page_content for doc in docs])),
    "question": lambda x: x["question"]  # 替换原来的RunnablePassthrough()
  }
  | review_prompt_template
  | llm
  | StrOutputParser()
)

额外适配建议

你使用的falcon-7b-instruct是纯文本指令模型,它对ChatMessage格式的兼容性不如纯文本prompt。建议你把原来的ChatPromptTemplate替换成普通的PromptTemplate,简化代码同时避免格式不兼容的潜在问题:

# 直接用PromptTemplate替代复杂的ChatMessage模板
review_prompt_template = PromptTemplate(
    input_variables=["context", "question"],
    template=review_template_str
)

这样你可以完全删掉原来的review_system_prompt和review_human_prompt定义,代码会更简洁,也更适配模型的输入习惯。


二、文档处理的优化方法

你当前手动拼接文档内容的方式是可行的,但可以从这几个方向进一步优化:

  1. 添加文档分隔符
    在拼接多个文档时,用明确的分隔符(比如"\n---\n")帮助模型区分不同文档的边界,避免模型混淆上下文:
lambda docs: "\n---\n".join([doc.page_content for doc in docs])
  1. 引入元数据增强上下文
    把文档的元数据(比如大学名称、课程名)也加入到context中,给模型提供更精准的来源信息:
lambda docs: "\n---\n".join([f"【{doc.metadata.get('University', '未知大学')}】\n{doc.page_content}" for doc in docs])
  1. 使用LangChain内置文档处理链
    如果需要处理长文档或复杂的文档组合逻辑,建议用LangChain内置的StuffDocumentsChain,它封装了最佳实践:
from langchain.chains.combine_documents.stuff import StuffDocumentsChain
from langchain.chains.llm import LLMChain

# 构建LLM链
llm_chain = LLMChain(llm=llm, prompt=review_prompt_template)
# 构建文档拼接链
stuff_chain = StuffDocumentsChain(
    llm_chain=llm_chain,
    document_variable_name="context"
)
# 最终链
review_chain = (
  {
    "context": reviews_retriever,
    "question": lambda x: x["question"]
  }
  | stuff_chain
  | StrOutputParser()
)
  1. 文档压缩过滤
    如果检索到的文档过长,可以用EmbeddingsFilter只保留与查询最相关的片段,提升响应速度和准确性:
from langchain.retrievers.document_compressors import EmbeddingsFilter
from langchain.retrievers import ContextualCompressionRetriever

# 构建基于嵌入的文档过滤器,只保留相似度高于0.7的内容
embeddings_filter = EmbeddingsFilter(embeddings=embeddings, similarity_threshold=0.7)
compression_retriever = ContextualCompressionRetriever(
    base_compressor=embeddings_filter,
    base_retriever=reviews_retriever
)
# 后续用compression_retriever替换原来的reviews_retriever即可

备注:内容来源于stack exchange,提问作者Saiyad Aamir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:33:05