基于LangChain与Llama Index构建Agentic RAG的函数调用错误排查
解决LangChain + Llama Index构建Agentic RAG的两类错误
错误1:AttributeError: 'LangChainLLM' object has no attribute 'model'
原因
Llama Index的FunctionCallingAgentWorker初始化时会检查LLM的model属性和metadata.is_function_calling_model标记,但LangChainLLM并未暴露内部LangChain模型的model属性,且传入的metadata未被正确映射到LangChainLLM的metadata中。
解决方案
手动给LangChainLLM实例补充model属性,并确保其metadata包含is_function_calling_model=True:
llm = LangChainLLM(llm=lc_llm_35) # 绑定内部LangChain模型的model名称 llm.model = lc_llm_35.model # 传递模型元数据标记 llm.metadata = lc_llm_35.metadata
错误2:bind_functions后提示"llm must be instance of LangChain BaseLanguageModel"
原因
bind_functions返回的是LangChain的Runnable对象,而非BaseLanguageModel子类,不符合LangChainLLM的输入类型要求。Llama Index的FunctionCallingAgentWorker会自行处理函数调用逻辑,无需在LangChain层提前绑定函数。
解决方案
移除bind_functions调用,直接使用原始AzureChatOpenAI实例传给LangChainLLM,由Llama Index负责函数调用的绑定与执行。
完整修正代码
主代码修改
from llama_index.core.agent import FunctionCallingAgentWorker from llama_index.core.agent import AgentRunner from src import custom_langchain from llama_index.core import Settings from llama_index.llms.langchain import LangChainLLM custom_lc_obj = custom_langchain.CustomLangchain(api_key=pack_api_key) # 创建AzureChatOpenAI实例,确保metadata标记函数调用支持 lc_llm_35 = custom_lc_obj.azure_chat_openai( model_name="gpt-35-turbo", api_version="2024-02-15-preview", metadata={"is_function_calling_model": True}, model_param={"temp": 0, "presence_penalty": 0.1, "top_p": 0.98} ) # 初始化LangChainLLM并补充必要属性 llm = LangChainLLM(llm=lc_llm_35) llm.model = lc_llm_35.model llm.metadata = lc_llm_35.metadata Settings.llm = llm Settings.embed_model = embedding # 初始化AgentWorker,无需提前绑定函数 agent_worker = FunctionCallingAgentWorker.from_tools( tool_retriever=query_engine, llm=llm, system_prompt="""You are an agent designed to answer queries over a set of given papers. Please always use the tools provided to answer a question.Do not rely on prior knowledge.""", verbose=True ) agent = AgentRunner(agent_worker)
可选优化:自定义LangChainLLM子类
如果需要复用逻辑,可创建子类避免重复赋值:
from llama_index.llms.langchain import LangChainLLM as BaseLangChainLLM class CustomLangChainLLM(BaseLangChainLLM): def __init__(self, llm, **kwargs): super().__init__(llm=llm, **kwargs) self.model = llm.model self.metadata = llm.metadata # 使用子类初始化LLM llm = CustomLangChainLLM(llm=lc_llm_35)
关键说明
- Llama Index的
FunctionCallingAgentWorker会通过metadata.is_function_calling_model自动识别支持函数调用的模型,无需手动在LangChain层绑定函数。 - 必须确保
AzureChatOpenAI的metadata中is_function_calling_model设为True,否则会触发模型不支持函数调用的错误。
内容的提问来源于stack exchange,提问作者Jaehyuk Choi
相关产品推荐
相关产品推荐

