初始化PythonREPL实例

AI应用开发2026年6月7日2

langchain如何自动执行python代码 | langchain

在当今的数据科学和人工智能领域,自动化代码生成与执行已成为提升效率与灵活性的重要手段。本文将详细介绍如何使用LangChain中的PythonREPL功能,实现大型语言模型(LLM)生成代码,并自动执行这些代码。通过这一流程,我们能够让大模型生成代码,然后通过代码执行来获取大语言模型通过文本生成本身不能很好完成的任务,特别是一些计算任务。

一、环境准备

首先,确保你的开发环境中已安装LangChain及其相关依赖。若尚未安装,可通过pip轻松完成:

pip install langchain

此外,还需配置好Python解释器及所需库(如datetime等),以确保PythonREPL能够顺利运行。

二、创建PythonREPL实例

在LangChain中,PythonREPL作为一个工具,允许我们执行任意Python代码。以下代码展示了如何创建PythonREPL实例:

from langchain_experimental.utilities import PythonREPL

# 初始化PythonREPL实例
python_repl = PythonREPL()

# 指定需要用到的全局的库
python_repl.globals = {"datetime": datetime}

三、利用大型语言模型生成代码

接下来,我们将利用大型语言模型(LLM)生成Python代码。此处假设你已有一个训练好的LLM模型,并可通过API进行访问。以下是一个利用LLM生成代码的示例:

这里使用讯飞星火的api接口来做演示


from openai import OpenAI
from langchain.llms.base import LLM
from typing import Any, List, Optional
from langchain.callbacks.manager import CallbackManagerForLLMRun
class SparkLLM(LLM):
    llm_client: Any = None

    def __init__(self):
        super().__init__()
        self.llm_client = OpenAI(
            api_key="xxx", # APIPassword
            base_url = 'https://spark-api-open.xf-yun.com/v1' # 指向讯飞星火的请求地址
            )
    def _call(self, prompt : str, stop: Optional[List[str]] = None,
                run_manager: Optional[CallbackManagerForLLMRun] = None,
                **kwargs: Any):
        response = self.llm_client.chat.completions.create(
                model='4.0Ultra', # 指定请求的版本
                messages = [
                    {"role": "system", "content": "你是一个智能AI助手,擅长编写合格的代码"},
                    {"role": "user", "content": prompt}
                ],
                temperature=0.7,  # 控制生成文本的随机性。越低越确定,越高越随机。
                top_p=0.9,       # 核采样 (Nucleus sampling)。top_p=0.9表示只考虑概率质量前90%的词。
                max_tokens=4096,  # 最大生成的token数量。
                stream=False      # 开启流式输出
            )
        return response.choices[0].message.content
    @property
    def _llm_type(self) -> str:
        return "sparkllm"

from replicate import Replicate  # 假设使用Replicate来访问LLM模型



# 实例化LLM模型(此处以replicate库为例,实际使用时需替换为你的LLM模型)
llm = SparkLLM()

# 给LLM模型一个提示,生成我们需要的Python代码
prompt = """
请编写一个Python函数,该函数接受一个整数n作为输入,
并返回从1到n(包含n)的所有整数的和。
"""
generated_code = llm(prompt)

print(generated_code)

生成的代码可能如下所示:

def sum_integers(n):
    total = 0
    for i in range(1, n + 1):
        total += i
    return total

四、在PythonREPL中执行生成的代码

现在,我们已在PythonREPL中执行上述生成的代码。利用python_repl.run方法,可轻松实现这一点:

# 执行生成的代码,并捕获输出
execution_result = python_repl.run(generated_code)
print("执行结果:")
print(execution_result)

但请注意,由于generated_code中未包含直接调用sum_integers函数的语句,因此execution_result可能无具体输出。为验证函数功能,我们需添加调用语句,如:

code_with_call = f"{generated_code}\nprint(sum_integers(10))"
execution_result = python_repl.run(code_with_call)
print("执行结果:")
print(execution_result)

此时,execution_result将显示函数sum_integers(10)的返回值,即55。

在来一写使用langchain的例子:

    from langchain_core.prompts import PromptTemplate
    from langchain_core.output_parsers import StrOutputParser

    template = """Write some python code to solve the user's problem. 

    Return only python code in Markdown format, e.g.:

    \```python
    ....
    \```
    problem:{input}
    """
    prompt_template = PromptTemplate.from_template(template)

    def _sanitize_output(text: str):
        _, after = text.split("```python")

        print(after.split("```")[0])
        return after.split("```")[0]


    pythonrepl = PythonREPL()
    pythonrepl.globals = {"datetime": datetime}

    model = SparkLLM()
    chain = prompt_template | model | StrOutputParser() | _sanitize_output | pythonrepl.run

    result = chain.invoke({"input": "whats 2 plus 2"})
    print(result)

    result = chain.invoke({"input": "what time now?"})
    print(result)

五、安全性与效率考量

在使用PythonREPL执行动态生成的代码时,安全性与效率至关重要。为确保代码安全,建议在沙箱环境中执行,或对代码进行预先审查。同时,对于大型代码块或复杂计算,需关注执行效率,并适时优化。

六、结论

通过LangChain的PythonREPL功能,我们实现了大型语言模型生成代码的自动化执行。这一流程不仅提升了代码生成的灵活性,还简化了代码验证与优化过程。未来,随着技术的不断发展,相信这一流程将变得更加高效与智能。


本文详细介绍了如何使用LangChain的PythonREPL功能,实现大型语言模型生成代码的自动化执行。希望这一流程能为你的数据科学与人工智能项目带来便利与启发。