Azure Container Apps动态会话-搭建安全可扩展的Python代码解释器环境
技术背景介绍
在现代软件开发中,运行业务逻辑代码时经常需要保证其安全性和可扩展性。尤其是在执行潜在的不受信任的代码时,确保其不会对系统造成危害至关重要。Azure Container Apps动态会话提供了一种安全且可扩展的方式来运行Python代码解释器。这些解释器运行在Hyper-V隔离的沙盒环境中,确保代码执行安全无害,同时还支持许多流行的Python包,如NumPy、pandas和scikit-learn。
核心原理解析
Azure Container Apps动态会话通过隔离的容器技术,允许在安全的环境中运行多种Python代码。每个运行环境都是Hyper-V隔离的,可以防止代码对主机系统造成任何影响。这种方式不仅提高了代码运行的安全性,还提升了系统的可扩展性。
代码实现演示
设置
首先,我们需要使用DefaultAzureCredential进行身份验证。这可以通过Azure CLI或VS Code进行本地认证。确保安装了Azure CLI并通过az login登录。
接下来,我们需要创建一个会话池,并获取池管理会话的端点。以下是代码示例:
import getpass
POOL_MANAGEMENT_ENDPOINT = getpass.getpass()
还需要安装相关的软件包:
%pip install -qU langchain-azure-dynamic-sessions langchain-openai langchainhub langchain langchain-community
实例化并使用工具
通过以下代码实例化SessionsPythonREPLTool并调用执行代码:
from langchain_azure_dynamic_sessions import SessionsPythonREPLTool
tool = SessionsPythonREPLTool(pool_management_endpoint=POOL_MANAGEMENT_ENDPOINT)
result = tool.invoke("6 * 7")
print(result)
返回结果为一个JSON字符串,包含代码输出的结果及任何标准输出和错误输出。
tool.execute("6 * 7")
返回的字典结果:
{
'$id': '2',
'status': 'Success',
'stdout': '',
'stderr': '',
'result': 42,
'executionTimeInMilliseconds': 8
}
上传数据
如果需要处理特定数据,可以使用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编码字符串的图片输出。以下是代码示例:
code = """
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-1, 1, 400)
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'])
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)
简单的Agent示例
以下是利用Langchain创建简单agent的示例:
from langchain import hub
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_azure_dynamic_sessions import SessionsPythonREPLTool
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o", temperature=0)
prompt = hub.pull("hwchase17/openai-functions-agent")
agent = create_tool_calling_agent(llm, [tool], prompt)
agent_executor = AgentExecutor(
agent=agent, tools=[tool], verbose=True, handle_parsing_errors=True
)
response = agent_executor.invoke(
{
"input": "what's sin of pi . if it's negative generate a random number between 0 and 5. if it's positive between 5 and 10."
}
)
应用场景分析
Azure Container Apps动态会话非常适用于需要高级数据处理和分析的场景,尤其是那些需要执行复杂、可能不信任的代码的应用。例如,金融分析、科学计算和AI模型训练等领域都可以从这种安全、可扩展的环境中受益。
实践建议
- 确保身份验证安全:使用安全的身份验证方法,如DefaultAzureCredential。
- 仔细管理会话池:根据应用需求合理配置和管理会话池,避免资源浪费。
- 监控代码执行时间:通过返回的执行时间来优化代码,提高性能。
- 数据传输安全:确保上传的数据在传输过程中安全无误。
如果遇到问题欢迎在评论区交流。
—END—

1192

被折叠的 条评论
为什么被折叠?



