LCEL链构建报TypeError:如何将LangChain文档加入LCEL链?
LCEL链TypeError错误修复方案
错误原因
触发TypeError: Expected a Runnable, callable or dict.Instead got an unsupported type: <class 'str'>的核心原因是:LCEL链的每个组件必须是Runnable、可调用对象或字典,而你在拼接文档内容时直接返回了字符串,这个字符串无法被LCEL的执行流程识别。
修复步骤及完整代码
1. 关键修复:用RunnableLambda包装文档拼接逻辑
将文档拼接函数通过RunnableLambda包装,使其成为符合LCEL规范的Runnable组件,这样就能无缝接入链的执行序列中。
2. 完整可运行代码示例
from langchain.retrievers import BM25Retriever, TFIDFRetriever from langchain.retrievers.rrf import RRFRetriever from langchain.prompts import ChatPromptTemplate from langchain.chat_models import ChatOpenAI from langchain.schema.output_parser import StrOutputParser from langchain.schema.runnable import RunnableLambda, RunnablePassthrough # 假设已准备好文档集合docs docs = [ # 这里替换为你的实际文档对象 ] # 初始化多个检索器 bm25_retriever = BM25Retriever.from_documents(docs) tfidf_retriever = TFIDFRetriever.from_documents(docs) # 初始化RRF重排检索器 rrf_retriever = RRFRetriever(retrievers=[bm25_retriever, tfidf_retriever]) # 定义文档格式化函数:将RRF返回的(文档,分数)元组列表拼接为字符串 def format_retrieved_docs(result_context): return "\n\n".join([doc.page_content for doc, _ in result_context]) # 用RunnableLambda包装函数,转为LCEL兼容的Runnable formatter = RunnableLambda(format_retrieved_docs) # 构建Prompt prompt = ChatPromptTemplate.from_template(""" 根据以下上下文信息回答用户问题: {context} 用户问题:{question} """) # 初始化LLM和输出解析器 llm = ChatOpenAI(model="gpt-3.5-turbo") output_parser = StrOutputParser() # 构建完整LCEL链 chain = ( { "question": RunnablePassthrough(), # 透传原始查询 "context": rrf_retriever | formatter # RRF重排后传递给格式化器 } | prompt | llm | output_parser ) # 调用链测试 response = chain.invoke("请根据上下文回答你的问题") print(response)
3. 核心修复点说明
- RunnableLambda包装:把返回字符串的
format_retrieved_docs函数转为Runnable,解决类型不兼容问题 - RunnablePassthrough:透传原始查询参数,确保Prompt能正确获取
question字段 - 链式调用逻辑:通过
|运算符串联组件,保证每个环节的输出都能正确传递给下一个组件
内容的提问来源于stack exchange,提问作者Christian01
相关产品推荐
相关产品推荐

