LangServe自定义Runnable链扩展报错TypeError,求解决方案
问题原因
修改后的get_rag_chain返回的是一个Runnable链对象,但invoke方法直接返回该对象而非执行链后的结果。当per_user_retriever作为链的起始环节时,它输出的是Runnable类型,后续的StrOutputParser无法处理该类型,触发类型错误。
修复步骤
修改
invoke方法,执行链并返回结果
将原来直接返回链对象的逻辑,改为调用链的invoke方法返回处理结果,并更新返回类型标注:def invoke( self, input: str, config: Optional[RunnableConfig] = None, **kwargs ) -> str: rag_chain = self.get_rag_chain(query=input) # 执行链并返回结果 return rag_chain.invoke(input, config=config, **kwargs)(可选)优化链的初始化性能
每次调用get_rag_chain都重新拉取prompt和初始化LLM会浪费资源,建议添加延迟加载逻辑避免重复初始化:class PerUserQuery(RunnableSerializable): user_id: Optional[str] openai_api_key: Optional[str] vectorstore: Optional[VectorStore] _prompt: Optional[PromptTemplate] = None _llm: Optional[BaseLLM] = None class Config: arbitrary_types_allowed = True def get_rag_chain(self, query): self.vectorstore = get_vectorstore(self.openai_api_key) docs = self.vectorstore.similarity_search( query, k=5, filter={"user_id": {"$eq": self.user_id}} ) def format_docs(docs_list): return "\n\n".join(doc.page_content for doc in docs_list) # 延迟加载prompt和LLM,避免重复初始化 if not self._prompt or not self._llm: self._prompt = hub.pull("rlm/rag-prompt") self._llm = get_llm(self.openai_api_key) return ( { "context": format_docs(docs), "question": RunnablePassthrough(), } | self._prompt | self._llm )验证链的使用
现在可以正常使用chain = per_user_retriever | StrOutputParser(),因为per_user_retriever.invoke()会返回LLM的输出(字符串或BaseMessage),StrOutputParser可以正确处理。
额外注意事项
- 确保
get_llm返回的LLM对象符合LangChain的BaseLLM接口,保证链调用正常执行。 - 若
openai_api_key是通过per_req_config_modifier动态传入,延迟加载逻辑能避免初始化时API密钥为空的问题。
内容的提问来源于stack exchange,提问作者Archit Gupta
相关产品推荐
相关产品推荐

