如何在LangChain Python Agent中使用scanpy?是否可行?
使用LangChain Python Agent调用scanpy和adata对象的解决方案
方案可行性结论
该方案完全可行,报错原因是Agent未识别到已注入的库和数据对象,或REPL工具的变量传递配置有误。
解决步骤及代码示例
1. 前置环境验证
先确保当前Python环境已安装scanpy,且adata对象能正常加载:
import scanpy as sc # 加载测试数据或你的自定义adata adata = sc.datasets.pbmc3k_processed() # 验证环境 print("scanpy版本:", sc.__version__) print("adata形状:", adata.shape)
2. 调整REPL工具配置
默认的PythonAstREPLTool可能存在沙箱限制,建议改用PythonREPLTool并直接注入全局变量,或修正Ast工具的变量传递逻辑:
方式一:使用PythonREPLTool(推荐)
from langchain.agents import create_python_agent, AgentType from langchain.tools.python.tool import PythonREPLTool from langchain.chat_models import ChatOpenAI # 初始化LLM openai_llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) # 创建REPL工具并注入全局变量 repl_tool = PythonREPLTool() repl_tool.globals["sc"] = sc repl_tool.globals["adata"] = adata # 自定义提示词,明确告知Agent已有的资源 custom_prompt = """你是一个能执行Python代码的助手,当前环境已导入scanpy(别名sc)和adata对象,无需重复import或加载数据。请根据需求编写并执行代码完成任务。 {input} {agent_scratchpad}""" # 创建Agent agent_executor = create_python_agent( llm=openai_llm, tool=repl_tool, verbose=True, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, agent_kwargs={"prompt": custom_prompt} )
方式二:修正PythonAstREPLTool配置
若坚持使用Ast版本工具,需确保locals参数正确传递,并配合提示词说明:
from langchain.tools.python.tool import PythonAstREPLTool ast_tool = PythonAstREPLTool(locals={"sc": sc, "adata": adata}) agent_executor = create_python_agent( llm=openai_llm, tool=ast_tool, verbose=True, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, agent_kwargs={"prompt": custom_prompt} )
3. 测试验证
执行简单任务验证配置是否生效:
# 示例任务:绘制UMAP图并保存 agent_executor.run("使用sc.pl.umap绘制adata的UMAP图,将结果保存为'umap_plot.png'")
常见问题排查
- 沙箱限制:部分REPL工具的安全沙箱可能阻止外部库调用,可检查LangChain工具的源码或配置,确认是否有禁用外部库的设置。
- 版本兼容:不同版本的LangChain对工具参数的定义可能不同,若参数报错,可查看对应版本的官方文档调整参数名称(如部分版本需用
globals替代locals)。 - 提示词明确性:必须在提示词中清晰告知Agent无需重复导入库或加载数据,否则Agent可能尝试重新import导致报错。
内容的提问来源于stack exchange,提问作者kurt
相关产品推荐
相关产品推荐

