LangChain Python Agent导入Scanpy异常:如何确保稳定导入依赖库
解决LangChain Python Agent无法稳定导入依赖库的问题
你遇到的问题核心是:LangChain的PythonREPLTool默认在独立的执行环境中运行代码,外部导入的库和定义的对象不会自动进入这个环境,导致Agent执行绘图任务时反复尝试导入scanpy却失败。以下是几种可靠的解决方法:
方案1:将依赖和对象直接注入REPL环境
PythonREPLTool支持通过globals参数,把外部已导入的库、定义的对象传入REPL的全局命名空间,让Agent可以直接使用,无需重复导入。
修改代码如下:
from dotenv import load_dotenv, find_dotenv import openai import os from langchain.chat_models import ChatOpenAI from langchain.agents.agent_types import AgentType from langchain_experimental.agents.agent_toolkits import create_python_agent from langchain_experimental.tools import PythonREPLTool import scanpy as sc load_dotenv(find_dotenv()) openai.api_key = os.environ["OPENAI_API_KEY"] # 定义你的pbmc对象(替换为实际初始化逻辑) pbmc = sc.read("pbmc3k.h5ad") # 初始化REPL工具,注入已有的库和对象 repl_tool = PythonREPLTool( globals={ "sc": sc, "pbmc": pbmc } ) agent_executor = create_python_agent( llm=ChatOpenAI(temperature=0, model="gpt-4-1106-preview"), tool=repl_tool, verbose=True, agent_type=AgentType.OPENAI_FUNCTIONS, agent_executor_kwargs={"handle_parsing_errors": True}, )
配置完成后,Agent执行代码时可直接调用sc.pl.umap(pbmc),无需再执行导入语句。
方案2:自定义预加载依赖的REPL工具
如果需要更灵活的初始化逻辑,可以自定义工具,在REPL执行前预先加载所有需要的依赖和对象:
from dotenv import load_dotenv, find_dotenv import openai import os from langchain.chat_models import ChatOpenAI from langchain.agents.agent_types import AgentType from langchain_experimental.agents.agent_toolkits import create_python_agent from langchain.tools import Tool import scanpy as sc load_dotenv(find_dotenv()) openai.api_key = os.environ["OPENAI_API_KEY"] # 自定义REPL函数,预先加载依赖 def preloaded_python_repl(code: str) -> str: # 预先执行导入和对象初始化 exec("import scanpy as sc", globals()) pbmc = sc.read("pbmc3k.h5ad") # 替换为你的pbmc初始化逻辑 globals()["pbmc"] = pbmc # 执行用户请求的代码 try: exec(code, globals()) return "代码执行完成" except Exception as e: return f"执行错误: {str(e)}" # 创建自定义工具 custom_repl_tool = Tool( name="PythonREPL", func=preloaded_python_repl, description="执行Python代码,已预先加载scanpy库和pbmc对象" ) agent_executor = create_python_agent( llm=ChatOpenAI(temperature=0, model="gpt-4-1106-preview"), tool=custom_repl_tool, verbose=True, agent_type=AgentType.OPENAI_FUNCTIONS, agent_executor_kwargs={"handle_parsing_errors": True}, )
方案3:优化提示词引导Agent使用已有依赖
在调用Agent时,明确告知环境中已存在所需的库和对象,避免Agent重复尝试导入:
agent_executor.run("当前环境已导入scanpy库(别名sc),且已存在pbmc对象,请直接使用它们绘制UMAP图")
总结
最稳定的方案是方案1,直接通过globals参数注入依赖和对象,确保REPL执行环境与外部环境共享资源,从根源上解决重复导入失败的问题。
内容的提问来源于stack exchange,提问作者kurt
相关产品推荐
相关产品推荐

