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

LangServe自定义Runnable链扩展报错TypeError,求解决方案

问题原因

修改后的get_rag_chain返回的是一个Runnable链对象,但invoke方法直接返回该对象而非执行链后的结果。当per_user_retriever作为链的起始环节时,它输出的是Runnable类型,后续的StrOutputParser无法处理该类型,触发类型错误。

修复步骤
  1. 修改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)
    
  2. (可选)优化链的初始化性能
    每次调用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
            )
    
  3. 验证链的使用
    现在可以正常使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:14:55