从零开始:用Python打造你的第一个AGI编程助手(附完整代码)
从零开始:用Python打造你的第一个AGI编程助手(附完整代码)
最近和几个刚入行的开发朋友聊天,他们总在感叹,现在AI编程工具层出不穷,但要么是云端服务调用起来像黑盒,要么就是框架庞大得让人望而生畏。有没有一种可能,我们自己就能动手,用最熟悉的Python,从最核心的原理出发,搭建一个真正能理解我们意图、并执行代码的智能体呢?这听起来像是通往AGI(人工通用智能)的遥远一步,但其实,它的核心逻辑远比想象中更贴近地面。这篇文章就是为你准备的,无论你是对AI充满好奇的编程新手,还是想深入理解智能体背后机制的经验开发者。我们将避开复杂的理论堆砌,直接进入实战,用大约50行清晰、可运行的代码,构建一个属于你自己的“Code Agent”。这个助手不仅能和你对话,更能理解你的编程需求,创建独立的Python执行环境,并安全地运行代码返回结果。整个过程,你会亲手触摸到大型语言模型如何与执行引擎结合,体验到“思考”与“行动”在一个AI系统中的闭环。准备好了吗?让我们打开编辑器,开始这段既有趣又有深度的创造之旅。
1. 核心理念:为什么从Code Agent切入理解AGI?
在深入代码之前,我们有必要先厘清一个概念:为什么业界常将“Code Agent”视为探索AGI的一条重要路径?这并非空穴来风。人工通用智能的终极目标,是让机器能够像人类一样,灵活地学习、推理并解决各类陌生问题。而“编程”这件事,恰好是一个近乎完美的测试场。它要求智能体至少具备以下几种核心能力:
- 自然语言理解:将人类模糊的需求描述(如“帮我分析一下这份销售数据”)转化为精确的、结构化的任务目标。
- 逻辑规划与分解:将大任务拆解为一系列可执行的子步骤,比如先读取数据文件,再进行清洗,最后选择合适的方法进行可视化。
- 工具使用与执行:调用正确的“工具”(在这里就是Python解释器及其丰富的库)来具体实施每一步计划。
- 结果验证与迭代:检查执行输出是否符合预期,如果出错,能够诊断问题并调整策略。
一个能够完成复杂编程任务的Code Agent,实际上已经在上述多个维度进行了演练。它不再是一个简单的聊天机器人,而是一个具备“感知-思考-行动”循环的自主智能体雏形。我们今天的项目,就是一个高度简化但五脏俱全的模型。通过它,你可以直观地看到,一个AI是如何将你的文字指令,变成一行行在独立沙箱中运行的代码,并带回答案的。这种从“说”到“做”的跨越,正是智能体(Agent)与传统AI应用的本质区别。
注意:本文构建的Agent侧重于“代码生成与执行”这一特定能力,是AGI宏大图景中的一个具体切片。理解这个切片的实现,是理解更复杂、更通用智能体的坚实基础。
2. 搭建你的智能体工程环境
任何值得投入的工程项目,都需要一个稳定、隔离的“工作间”。为了避免不同项目间的依赖冲突,我们首选使用Conda来创建独立的Python环境。这不仅是一个好习惯,更是确保你的智能体能够稳定运行的前提。
2.1 创建并激活虚拟环境
打开你的终端(或Anaconda Prompt),执行以下命令来创建一个基于Python 3.11的新环境,并命名为 ai_agent_env:
# 创建新环境,指定Python版本为3.11或更高
conda create -n ai_agent_env python=3.11 -y
# 激活创建好的环境
conda activate ai_agent_env
激活后,你的命令行提示符前通常会显示环境名 (ai_agent_env),这表示后续的所有操作都将在这个“沙箱”中进行。
2.2 安装核心框架:Semantic Kernel
我们的智能体需要一个“大脑”来协调思考和行动。这里我们选用微软开源的 Semantic Kernel(SK)。它不是一个庞大的AI模型,而是一个轻量级的“胶水”框架,专门设计用来将大型语言模型(LLM)的能力方便地集成到你的应用中,并管理所谓的“插件”(即各种工具和功能)。你可以把它想象成智能体的中枢神经系统。
# 使用pip安装Semantic Kernel的核心包
pip install semantic-kernel
SK支持连接多种后端AI服务,如OpenAI、Azure OpenAI或本地部署的模型。为了教程的通用性和可运行性,我们将主要基于其架构进行讲解,并提供适配不同后端的代码思路。
2.3 准备代码执行引擎:Pandora Box服务
智能体需要“手”来执行代码。我们不可能让它在我们的主系统上随意运行未知代码,那太危险了。因此,我们需要一个安全的代码执行沙箱。这里我们引入一个名为 Pandora Box 的开源工具(仅用于示例教学,请注意其使用条款)。它可以创建一个临时的、隔离的Python环境,并通过HTTP API接收代码、执行并返回结果。
首先,在同一个虚拟环境中安装Pandora Box:
pip install PandoraBox
安装完成后,你需要生成一个唯一的API密钥,并启动本地服务:
# 生成一个API密钥,请妥善保存输出结果
pbox a
# 启动Pandora Box的本地HTTP服务
pbox s
服务默认会在 http://127.0.0.1:9501 启动。你可以通过访问 http://127.0.0.1:9501/docs 来查看其交互式API文档,确认服务已正常运行。这个服务将作为我们智能体的“代码执行插件”。
3. 智能体核心架构与代码逐行解析
现在,让我们进入最激动人心的部分:编写智能体本身。我们将创建一个Python脚本,它利用Semantic Kernel来连接AI“大脑”和Pandora Box“双手”。以下是完整的代码,我们将分块进行详细解读。
3.1 初始化:组装智能体的大脑与工具
首先,导入必要的模块,并搭建智能体的基础骨架。
import asyncio
from semantic_kernel import Kernel
from semantic_kernel.contents import ChatHistory
from semantic_kernel.connectors.ai.open_ai import (
AzureChatCompletion, # 如果使用Azure OpenAI
OpenAIChatCompletion, # 如果使用原生OpenAI
AzureChatPromptExecutionSettings
)
from semantic_kernel.connectors.openapi_plugin import OpenAPIFunctionExecutionParameters
from semantic_kernel.connectors.ai.function_call_behavior import FunctionCallBehavior
from semantic_kernel.functions import KernelArguments
关键点解析:
Kernel:这是Semantic Kernel的核心类,是所有服务和插件的注册中心,也是执行流程的协调者。ChatHistory:用于维护与AI模型的对话历史,使其具备上下文记忆能力。- 我们导入了两种聊天完成服务,你可以根据自己拥有的API资源选择其一。
AzureChatCompletion用于连接微软Azure的OpenAI服务,OpenAIChatCompletion用于连接OpenAI官方API。
接下来,在 main 异步函数中,我们开始实例化并配置Kernel。
async def main():
# 1. 创建Kernel实例
kernel = Kernel()
# 2. 配置AI模型服务(以OpenAI为例)
# 请将以下参数替换为你自己的API信息
chat_service = OpenAIChatCompletion(
service_id="code_assistant",
ai_model_id="gpt-4o-mini", # 也可使用 gpt-3.5-turbo
api_key="your-openai-api-key-here" # 你的OpenAI API Key
)
kernel.add_service(chat_service)
# 3. 添加Pandora Box作为执行插件
kernel.add_plugin_from_openapi(
plugin_name='PandoraBox',
openapi_document_path='http://127.0.0.1:9501/openapi.json',
execution_settings=OpenAPIFunctionExecutionParameters(
enable_payload_namespacing=True
)
)
配置说明:
service_id和ai_model_id用于标识服务。api_key是你从OpenAI平台获取的密钥。切勿将真实的API密钥提交到版本控制系统! 建议通过环境变量读取。add_plugin_from_openapi是SK一个非常强大的功能。它直接读取Pandora Box服务提供的openapi.json描述文件,自动将其所有API端点(如创建环境、执行代码)转化为Kernel内部可以调用的“函数”。这意味着,AI模型在思考时,就知道自己“手头”有哪些工具可用。
3.2 配置对话与函数调用行为
智能体需要知道何时以及如何调用工具。我们通过配置提示执行设置来实现。
# 4. 配置函数调用行为
prompt_execution_settings = AzureChatPromptExecutionSettings(
tool_choice="auto", # 让模型自动决定是否调用工具
function_call_behavior=FunctionCallBehavior.EnableFunctions(
auto_invoke=True, # Kernel自动执行模型选择的函数调用
filters={} # 可以在这里设置过滤器,限制可调用的函数
)
)
# 5. 初始化对话历史并设置系统角色
history = ChatHistory()
system_message = """
你是一个专业的Python代码助手。你的核心能力是帮助用户解决计算和编程问题。
你可以通过调用PandoraBox插件来执行以下操作:
1. 创建一个新的、隔离的Python执行环境。
2. 在该环境中运行用户提供的Python代码。
3. 管理环境的生命周期。
当用户的问题涉及计算、数据分析、算法或需要运行代码验证时,你应该主动规划步骤:
a. 判断是否需要创建新环境(如果用户没有指定,可以新建一个)。
b. 编写解决问题的Python代码。
c. 调用插件执行代码。
d. 将执行结果清晰、准确地解释给用户。
你的回答应简洁专业,直接呈现代码和结果。如果执行出错,尝试分析错误原因。
可用的API密钥:xxxxxxxxxxxxxx(此处填入pbox a生成的key)
"""
history.add_system_message(system_message)
系统提示词(System Prompt)的精髓: 这段系统消息是智能体的“人格”和“工作说明书”。它定义了:
- 角色:Python代码助手。
- 能力范围:明确告知模型它拥有PandoraBox插件及其功能。
- 工作流程:给出了一个清晰的“规划-编码-执行-反馈”的思维链(Chain of Thought)范例。
- 约束与格式:要求回答简洁专业,并处理错误。 精心设计的系统提示是引导大模型行为、提升智能体可靠性的最关键环节之一,其重要性不亚于代码本身。
3.3 实现交互主循环
最后,我们实现一个简单的命令行交互循环,让智能体“活”起来。
print("智能体已启动。输入您的问题(例如‘解方程 3x+5=11’或‘画一个正弦波’),输入‘退出’结束。")
# 6. 开始交互循环
while True:
try:
user_input = input("\n用户 > ").strip()
if user_input.lower() in ['退出', 'exit', 'quit']:
print("对话结束。")
break
history.add_user_message(user_input)
# 7. 调用模型,并允许其自动触发函数调用
print("助手 > ", end='', flush=True)
result = chat_service.get_streaming_chat_message_contents(
chat_history=history,
settings=prompt_execution_settings,
kernel=kernel,
arguments=KernelArguments() # 可以传递额外参数
)
# 流式打印模型回复
full_response = ""
async for chunk in result:
content = str(chunk[0]) if chunk else ""
print(content, end='', flush=True)
full_response += content
print() # 换行
# 将模型的完整回复加入历史,维持上下文
history.add_assistant_message(full_response)
except KeyboardInterrupt:
print("\n程序被中断。")
break
except Exception as e:
print(f"\n发生错误: {e}")
# 可以选择将错误信息加入历史,让模型知晓
history.add_assistant_message(f"系统执行出错: {e}")
if __name__ == '__main__':
asyncio.run(main())
循环中的关键机制:
- 流式输出:
get_streaming_chat_message_contents方法实现了逐词输出,模仿了真实的AI对话体验,而不是等待全部生成完毕再显示。 - 自动函数调用:由于我们设置了
auto_invoke=True,当模型在生成回复过程中认为需要调用PandoraBox的函数(比如create_environment或execute_code)时,Kernel会自动拦截这次调用,去执行对应的HTTP请求,并将执行结果作为上下文插回给模型,让模型继续生成面向用户的最终回答。这个过程对用户是透明的。 - 历史维护:严格地将用户输入和助手输出轮流加入
ChatHistory,这是实现多轮对话连贯性的基础。
4. 实战演练:与你的智能体对话
现在,在确保Pandora Box服务 (pbox s) 正在运行的前提下,在终端中运行你的Python脚本。让我们通过几个真实的例子,看看这个50行代码构建的智能体能做什么。
案例一:解决数学问题
用户 > 帮我计算从1加到100的和,并用高斯公式验证。
助手 > 我将先创建一个Python环境来计算。... [创建环境成功]
现在,我将编写代码计算1到100的和,并使用高斯公式 n*(n+1)/2 进行验证。
```python
# 直接累加
sum_direct = sum(range(1, 101))
# 高斯公式
n = 100
sum_gauss = n * (n + 1) // 2
print(f"直接累加结果: {sum_direct}")
print(f"高斯公式结果: {sum_gauss}")
print(f"两者是否一致: {sum_direct == sum_gauss}")
执行代码后,返回结果: 直接累加结果: 5050 高斯公式结果: 5050 两者是否一致: True 因此,1到100的和是5050,两种方法结果一致。
**案例二:执行数据分析任务**
用户 > 我有一个列表:[12, 45, 23, 67, 9, 33]。请帮我找出最大值、最小值和平均值。 助手 > 我将运行代码来分析这个列表。
data = [12, 45, 23, 67, 9, 33]
max_val = max(data)
min_val = min(data)
avg_val = sum(data) / len(data)
print(f"列表: {data}")
print(f"最大值: {max_val}")
print(f"最小值: {min_val}")
print(f"平均值: {avg_val:.2f}")
执行结果: 列表: [12, 45, 23, 67, 9, 33] 最大值: 67 最小值: 9 平均值: 31.50
**案例三:处理复杂请求与错误**
用户 > 读取一个不存在的文件‘test.txt’,然后告诉我文件内容。 助手 > 我将尝试执行读取文件的操作。
with open('test.txt', 'r') as f:
content = f.read()
print(content)
执行时发生了错误: FileNotFoundError: [Errno 2] No such file or directory: 'test.txt' 错误原因是当前工作目录下不存在名为‘test.txt’的文件。请检查文件路径和名称是否正确。
通过这些对话,你可以清晰地看到智能体的完整工作流:理解问题 -> 规划(决定写代码)-> 行动(调用插件执行)-> 观察结果 -> 生成最终回复。这正是智能体范式的魅力所在。
## 5. 深入优化与扩展思路
我们的基础版本已经可以工作,但一个健壮的、可投入实际使用的智能体还需要更多考量。以下是几个关键的优化和扩展方向:
### 5.1 增强安全性与可靠性
* **沙箱强化**:Pandora Box提供了基础隔离,但对于生产环境,可以考虑更严格的容器化方案(如Docker沙箱),并限制网络访问、运行时间和资源(CPU/内存)。
* **代码审查与过滤**:在将用户请求或模型生成的代码发送给执行引擎前,可以加入一层安全检查,过滤掉明显危险的系统调用(如 `os.system(‘rm -rf /’)`)、无限循环或资源耗尽型代码。
* **错误处理与重试**:为插件调用(HTTP请求)添加更完善的错误处理、超时控制和指数退避重试机制。
### 5.2 扩展智能体的能力边界
目前我们的智能体只有一个“代码执行”插件。Semantic Kernel的强大之处在于可以轻松集成更多插件,打造全能助手。
| 插件类型 | 功能描述 | 可能实现方式 |
| :--- | :--- | :--- |
| **网络搜索** | 回答实时性问题,获取最新资讯。 | 集成Serper API、DuckDuckGo搜索插件。 |
| **知识库查询** | 回答基于特定文档(如公司手册、产品文档)的问题。 | 使用SK的文本嵌入和向量存储功能构建RAG(检索增强生成)系统。 |
| **文件操作** | 读取、分析、总结用户上传的文档(PDF, Word, Excel)。 | 集成 `unstructured`、`pypdf` 等库作为插件函数。 |
| **第三方API** | 发送邮件、管理日历、查询天气、控制智能家居。 | 通过OpenAPI描述文件添加任何网络服务。 |
添加新插件通常只需要一行类似的 `add_plugin_from_openapi` 调用,或者为本地函数添加 `@kernel_function` 装饰器。智能体的“工具箱”就这样被不断丰富。
### 5.3 优化提示工程与规划能力
系统提示词可以进一步细化,以提升智能体的决策质量:
* **分步思考**:明确要求模型在内部先输出“思考:”步骤,再输出“行动:”和“最终答案:”,这有助于调试和提升逻辑性。
* **多工具协作**:在提示词中教导模型如何组合使用工具。例如:“如果用户问‘今天纽约的天气如何,并用Python画个温度趋势图’,你应该先调用天气插件获取数据,再调用代码执行插件运行绘图代码。”
* **持久化记忆**:当前的对话历史仅在内存中。可以通过集成数据库,让智能体记住跨会话的用户偏好和历史任务上下文。
写完这个智能体,我最深的体会是,AGI的神秘面纱在动手实践中被一层层揭开了。它不再是新闻里遥不可及的概念,而是一系列具体技术组件的巧妙拼接——大模型提供理解和生成,框架管理工具和流程,执行引擎赋予行动能力。这个50行代码的项目就像一个乐高底座,你已经掌握了最核心的连接器。接下来,是给它装上更强大的“思维模型”(尝试GPT-4、Claude-3),配备更丰富的“工具手”(接入更多API),还是设计更精妙的“任务流程图”(实现多智能体协作),完全取决于你的想象力和需求。编程的世界里,最好的学习永远是创造。现在,你的第一个智能体已经在线,不妨试着给它出个更难的题目,看看你们能一起走多远。更多推荐
所有评论(0)