Skip to main content
Azure 容器应用动态会话提供了一种安全且可扩展的方式,在 Hyper-V 隔离的沙箱中运行 Python 代码解释器。这允许您的代理在安全环境中运行可能不受信任的代码。代码解释器环境包含许多流行的 Python 包,例如 NumPy、pandas 和 scikit-learn。有关会话工作原理的更多信息,请参阅 Azure 容器应用文档

设置

默认情况下,SessionsPythonREPLTool 工具使用 DefaultAzureCredential 进行 Azure 身份验证。在本地,它将使用您来自 Azure CLI 或 VS Code 的凭据。安装 Azure CLI 并使用 az login 登录以进行身份验证。 要使用代码解释器,您还需要创建一个会话池,您可以按照会话池创建说明进行操作。完成后,您将拥有一个池管理会话端点,您需要在下面设置它:
import getpass

POOL_MANAGEMENT_ENDPOINT = getpass.getpass()
 ········
您还需要安装 langchain-azure-dynamic-sessions 包:
pip install -qU langchain-azure-dynamic-sessions langchain-openai langchainhub langchain langchain-community

使用工具

实例化并使用工具:
from langchain_azure_dynamic_sessions import SessionsPythonREPLTool

tool = SessionsPythonREPLTool(pool_management_endpoint=POOL_MANAGEMENT_ENDPOINT)
tool.invoke("6 * 7")
'{\n  "result": 42,\n  "stdout": "",\n  "stderr": ""\n}'
调用工具将返回一个包含代码结果以及任何 stdout 和 stderr 输出的 json 字符串。要获取原始字典结果,请使用 execute() 方法:
tool.execute("6 * 7")
{'$id': '2',
 'status': 'Success',
 'stdout': '',
 'stderr': '',
 'result': 42,
 'executionTimeInMilliseconds': 8}

上传数据

如果我们想对特定数据执行计算,可以使用 upload_file() 功能将数据上传到我们的会话。您可以通过 data: BinaryIO 参数或通过 local_file_path: str 参数(指向系统上的本地文件)上传数据。数据会自动上传到会话容器中的 “/mnt/data/” 目录。您可以通过 upload_file() 返回的上传元数据获取完整文件路径。
import io
import json

data = {"important_data": [1, 10, -1541]}
binary_io = io.BytesIO(json.dumps(data).encode("ascii"))

upload_metadata = tool.upload_file(
    data=binary_io, remote_file_path="important_data.json"
)

code = f"""
import json

with open("{upload_metadata.full_path}") as f:
    data = json.load(f)

sum(data['important_data'])
"""
tool.execute(code)
{'$id': '2',
 'status': 'Success',
 'stdout': '',
 'stderr': '',
 'result': -1530,
 'executionTimeInMilliseconds': 12}

处理图像结果

动态会话结果可以包含以 base64 编码字符串形式的图像输出。在这种情况下,‘result’ 的值将是一个字典,包含键 “type”(值为 “image”)、“format”(图像格式)和 “base64_data”。
code = """
import numpy as np
import matplotlib.pyplot as plt

# 生成从 -1 到 1 的 x 值
x = np.linspace(-1, 1, 400)

# 计算每个 x 值的正弦值
y = np.sin(x)

# 创建绘图
plt.plot(x, y)

# 添加标题和标签
plt.title('Plot of sin(x) from -1 to 1')
plt.xlabel('x')
plt.ylabel('sin(x)')

# 显示绘图
plt.grid(True)
plt.show()
"""

result = tool.execute(code)
result["result"].keys()
dict_keys(['type', 'format', 'base64_data'])
result["result"]["type"], result["result"]["format"]
('image', 'png')
我们可以解码图像数据并显示它:
import base64
import io

from IPython.display import display
from PIL import Image

base64_str = result["result"]["base64_data"]
img = Image.open(io.BytesIO(base64.decodebytes(bytes(base64_str, "utf-8"))))
display(img)