
AI Agents-2 | 手把手教你:从零开始打造AI智能体 原创
这个系列文章旨在为AI代理(AI Agent)提供全面的概述,深入研究其特征,组成部分和类型,同时探索其进化,挑战和潜在的未来方向。
在上一篇文章中,我们深入探讨了AI智能体的特性、组成、演变、挑战以及未来可能性。今天,我们要更进一步,手把手教你用Python从零搭建一个AI智能体。这个智能体可以根据用户输入做出决策,选择合适的工具,并执行相应任务。话不多说,让我们立刻开始吧!
一、什么是AI智能体?
简单来说,AI智能体就是一个能够自主感知环境、做出决策并采取行动以实现特定目标的实体。智能体的复杂程度千差万别,从简单地对刺激做出反应的智能体,到能够学习并随时间适应的高级智能体,种类繁多。
常见的智能体类型有:
- 反应型智能体:直接对环境变化做出反应,没有内部记忆。
- 基于模型的智能体:利用内部的世界模型来做出决策。
- 目标型智能体:根据特定目标规划行动。
- 效用型智能体:基于效用函数评估潜在行动,以最大化结果。
具体例子包括聊天机器人、推荐系统和自动驾驶汽车,它们各自利用不同类型的智能体高效、智能地完成任务。
我们今天要搭建的智能体,核心组件包括:
- 模型:智能体的“大脑”,负责处理输入并生成响应。
- 工具:智能体可以根据用户请求执行的预定义函数。
- 工具箱:智能体可以使用的工具集合。
- 系统提示:指导智能体如何处理用户输入并选择合适工具的指令集。
二、搭建智能体的准备工作
在动手之前,先确保你的系统满足以下条件:
(一)Python环境搭建
你需要安装Python来运行AI智能体。以下是搭建环境的步骤:
1.安装Python(推荐3.8及以上版本)访问python.org,下载并安装Python。验证安装是否成功:
python --version
2.创建虚拟环境(推荐)使用虚拟环境管理依赖项是个好习惯:
python -m venv ai_agents_env
source ai_agents_env/bin/activate # Windows系统用:ai_agents_env\Scripts\activate
3.安装依赖项进入项目目录后,安装所需的依赖项:
pip install -r requirements.txt
(二)本地部署Ollama
Ollama是一个用于高效运行和管理本地语言模型的工具。以下是安装和配置步骤:
1.下载并安装Ollama访问Ollama官网,下载适合你操作系统的安装包,并按照说明进行安装。
2.验证Ollama安装运行以下命令检查Ollama是否安装成功:
ollama --version
3.拉取模型(如有需要)如果你的智能体实现需要特定模型,可以通过以下命令拉取:
ollama pull mistral # 将“mistral”替换为你需要的模型
三、搭建智能体的具体步骤
(一)搭建环境
除了Python,我们还需要安装一些核心库,比如requests
、json
和termcolor
,此外,我们还会用到dotenv
来管理环境变量。
pip install requests termcolor python-dotenv
(二)定义模型类
智能体需要一个模型来处理用户输入。我们将创建一个OllamaModel
类,它通过本地API与模型交互并生成响应。以下是基础实现:
from termcolor import colored
import os
from dotenv import load_dotenv
load_dotenv()
### 模型
import requests
import json
class OllamaModel:
def __init__(self, model, system_prompt, temperature=0, stop=None):
"""
初始化OllamaModel,设置模型名称、系统提示、温度和停止标记。
"""
self.model_endpoint = "http://localhost:11434/api/generate"
self.temperature = temperature
self.model = model
self.system_prompt = system_prompt
self.headers = {"Content-Type": "application/json"}
self.stop = stop
def generate_text(self, prompt):
"""
根据用户输入生成响应。
"""
payload = {
"model": self.model,
"format": "json",
"prompt": prompt,
"system": self.system_prompt,
"stream": False,
"temperature": self.temperature,
"stop": self.stop
}
try:
response = requests.post(
self.model_endpoint,
headers=self.headers,
data=json.dumps(payload)
)
response_json = response.json()
response_text = response_json['response']
response_dict = json.loads(response_text)
print(colored(f"\n\n模型响应:{response_dict}", "cyan"))
return response_dict
except requests.RequestException as e:
return {"error": f"调用模型时出错!{str(e)}"}
这个类通过模型名称、系统提示、温度和停止标记初始化,并通过generate_text
方法向模型API发送请求并返回响应。
(三)为智能体创建工具
接下来,我们需要为智能体创建一些工具。这些工具是简单的Python函数,用于执行特定任务。比如一个基础计算器和一个字符串反转器:
import json
import operator
def basic_calculator(input_str):
"""
执行两个数字的数值运算。
"""
try:
if isinstance(input_str, dict):
input_dict = input_str
else:
input_dict = json.loads(input_str.replace("'", "\"").strip().strip("\""))
ifnot all(key in input_dict for key in ['num1', 'num2', 'operation']):
return"输入错误:必须包含'num1'、'num2'和'operation'"
num1 = float(input_dict['num1'])
num2 = float(input_dict['num2'])
operation = input_dict['operation'].lower()
operations = {
'add': operator.add,
'plus': operator.add,
'subtract': operator.sub,
'minus': operator.sub,
'multiply': operator.mul,
'times': operator.mul,
'divide': operator.truediv,
'floor_divide': operator.floordiv,
'modulus': operator.mod,
'power': operator.pow
}
if operation notin operations:
returnf"不支持的操作:'{operation}'。支持的操作有:{', '.join(operations.keys())}"
if operation in ['divide', 'floor_divide', 'modulus'] and num2 == 0:
return"除数不能为零!"
result = operations[operation](num1, num2)
returnf"结果是:{result:.6f}".rstrip('0').rstrip('.')
except Exception as e:
returnf"计算出错:{str(e)}"
def reverse_string(input_string):
"""
反转字符串。
"""
ifnot isinstance(input_string, str):
return"输入必须是字符串!"
reversed_string = input_string[::-1]
returnf"反转后的字符串是:{reversed_string}"
(四)构建工具箱
ToolBox
类用于存储智能体可以使用的工具,并为每个工具提供描述:
class ToolBox:
def __init__(self):
"""
初始化工具箱。
"""
self.tools_dict = {}
def store(self, functions_list):
"""
存储工具函数的名称和描述。
"""
for func in functions_list:
self.tools_dict[func.__name__] = func.__doc__
return self.tools_dict
def tools(self):
"""
返回存储的工具描述。
"""
tools_str = ""
for name, doc in self.tools_dict.items():
tools_str += f"{name}: \"{doc}\"\n"
return tools_str.strip()
这个类可以帮助智能体了解可用的工具及其功能。
(五)创建智能体类
智能体需要思考、选择合适的工具并执行它。以下是Agent
类的实现:
agent_system_prompt_template = """
你是一个智能AI助手,可以调用以下工具。你的回答必须始终是以下JSON格式:
{{
"tool_choice": "工具名称",
"tool_input": "工具输入"
}}
工具列表及使用场景:
1. basic_calculator:用于任何数学计算
- 输入格式:{{"num1": 数字, "num2": 数字, "operation": "加/减/乘/除"}}
- 示例:
输入:"15加7"
输出:{{"tool_choice": "basic_calculator", "tool_input": {{"num1": 15, "num2": 7, "operation": "add"}}}}
2. reverse_string:用于任何文本反转请求
- 输入格式:直接输入需要反转的文本
- 示例:
输入:"反转'Hello'"
输出:{{"tool_choice": "reverse_string", "tool_input": "Hello"}}
3. no_tool:用于一般性对话或问题
- 示例:
输入:"你是谁?"
输出:{{"tool_choice": "no_tool", "tool_input": "我是你的AI助手,可以帮你计算数学题、反转文本或回答问题。"}}
请记住:你的回答必须始终是有效的JSON格式,包含"tool_choice"和"tool_input"字段。
"""
class Agent:
def __init__(self, tools, model_service, model_name, stop=None):
"""
初始化智能体,传入工具列表和模型。
"""
self.tools = tools
self.model_service = model_service
self.model_name = model_name
self.stop = stop
def prepare_tools(self):
"""
准备工具并返回工具描述。
"""
toolbox = ToolBox()
toolbox.store(self.tools)
tool_descriptions = toolbox.tools()
return tool_descriptions
def think(self, prompt):
"""
根据用户输入生成响应。
"""
tool_descriptions = self.prepare_tools()
agent_system_prompt = agent_system_prompt_template.format(tool_descriptinotallow=tool_descriptions)
model_instance = self.model_service(
model=self.model_name,
system_prompt=agent_system_prompt,
temperature=0,
stop=self.stop
)
agent_response_dict = model_instance.generate_text(prompt)
return agent_response_dict
def work(self, prompt):
"""
解析响应并执行工具。
"""
agent_response_dict = self.think(prompt)
tool_choice = agent_response_dict.get("tool_choice")
tool_input = agent_response_dict.get("tool_input")
for tool in self.tools:
if tool.__name__ == tool_choice:
response = tool(tool_input)
print(colored(response, 'cyan'))
return
print(colored(tool_input, 'cyan'))
return
这个类有三个主要方法:
- **
prepare_tools
**:存储工具并返回工具描述。 - **
think
**:根据用户输入选择合适的工具。 - **
work
**:执行选定的工具并返回结果。
(六)运行智能体
最后,我们将所有组件组合起来,运行智能体。在脚本的主部分,初始化智能体并开始接受用户输入:
if __name__ == "__main__":
print("\n欢迎使用AI智能体!输入'exit'退出。")
print("你可以让我:")
print("1. 进行数学计算(例如:'15加7')")
print("2. 反转字符串(例如:'反转hello world')")
print("3. 回答一般性问题\n")
tools = [basic_calculator, reverse_string]
model_service = OllamaModel
model_name = "llama2"# 可以替换为其他模型,如'mistral'、'codellama'等
stop = "<|eot_id|>"
agent = Agent(tools=tools, model_service=model_service, model_name=model_name, stop=stop)
whileTrue:
prompt = input("问我任何问题:")
if prompt.lower() == "exit":
break
agent.work(prompt)
四、总结
通过这篇文章,我们从零开始搭建了一个AI智能体。完成了环境搭建、模型定义、工具创建、工具箱构建,并最终让智能体运行起来。这种结构化的搭建方式为创建智能、交互式的智能体奠定了坚实基础。
随着AI智能体的不断发展,它们的应用场景将扩展到更多行业,推动效率和创新。未来,我们将继续探索更多功能,让智能体变得更强大、更智能。敬请期待!
本文转载自公众号Halo咯咯 作者:基咯咯
