AI Agents-2 | 手把手教你:从零开始打造AI智能体 原创

发布于 2025-3-24 10:36
574浏览
0收藏

这个系列文章旨在为AI代理(AI Agent)提供全面的概述,深入研究其特征,组成部分和类型,同时探索其进化,挑战和潜在的未来方向。

在​​上一篇文章​​中,我们深入探讨了AI智能体的特性、组成、演变、挑战以及未来可能性。今天,我们要更进一步,手把手教你用Python从零搭建一个AI智能体。这个智能体可以根据用户输入做出决策,选择合适的工具,并执行相应任务。话不多说,让我们立刻开始吧!

一、什么是AI智能体?

简单来说,AI智能体就是一个能够自主感知环境、做出决策并采取行动以实现特定目标的实体。智能体的复杂程度千差万别,从简单地对刺激做出反应的智能体,到能够学习并随时间适应的高级智能体,种类繁多。

常见的智能体类型有:

  1. 反应型智能体:直接对环境变化做出反应,没有内部记忆。
  2. 基于模型的智能体:利用内部的世界模型来做出决策。
  3. 目标型智能体:根据特定目标规划行动。
  4. 效用型智能体:基于效用函数评估潜在行动,以最大化结果。

具体例子包括聊天机器人、推荐系统和自动驾驶汽车,它们各自利用不同类型的智能体高效、智能地完成任务。

我们今天要搭建的智能体,核心组件包括:

  • 模型:智能体的“大脑”,负责处理输入并生成响应。
  • 工具:智能体可以根据用户请求执行的预定义函数。
  • 工具箱:智能体可以使用的工具集合。
  • 系统提示:指导智能体如何处理用户输入并选择合适工具的指令集。

二、搭建智能体的准备工作

AI Agents-2 | 手把手教你:从零开始打造AI智能体-AI.x社区

在动手之前,先确保你的系统满足以下条件:

(一)Python环境搭建

你需要安装Python来运行AI智能体。以下是搭建环境的步骤:

1.安装Python(推荐3.8及以上版本)访问python.org,下载并安装Python。验证安装是否成功:

python --version
  • 1.

2.创建虚拟环境(推荐)使用虚拟环境管理依赖项是个好习惯:

python -m venv ai_agents_env
source ai_agents_env/bin/activate  # Windows系统用:ai_agents_env\Scripts\activate
  • 1.
  • 2.

3.安装依赖项进入项目目录后,安装所需的依赖项:

pip install -r requirements.txt
  • 1.

(二)本地部署Ollama

Ollama是一个用于高效运行和管理本地语言模型的工具。以下是安装和配置步骤:

1.下载并安装Ollama访问Ollama官网,下载适合你操作系统的安装包,并按照说明进行安装。

2.验证Ollama安装运行以下命令检查Ollama是否安装成功:

ollama --version
  • 1.

3.拉取模型(如有需要)如果你的智能体实现需要特定模型,可以通过以下命令拉取:

ollama pull mistral  # 将“mistral”替换为你需要的模型
  • 1.

三、搭建智能体的具体步骤

AI Agents-2 | 手把手教你:从零开始打造AI智能体-AI.x社区

(一)搭建环境

除了Python,我们还需要安装一些核心库,比如​​requests​​​、​​json​​​和​​termcolor​​​,此外,我们还会用到​​dotenv​​来管理环境变量。

pip install requests termcolor python-dotenv
  • 1.

(二)定义模型类

智能体需要一个模型来处理用户输入。我们将创建一个​​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)}"}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.

这个类通过模型名称、系统提示、温度和停止标记初始化,并通过​​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}"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.

(四)构建工具箱

​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()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

这个类可以帮助智能体了解可用的工具及其功能。

(五)创建智能体类

智能体需要思考、选择合适的工具并执行它。以下是​​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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.

这个类有三个主要方法:

  1. **​​prepare_tools​​**:存储工具并返回工具描述。
  2. **​​think​​**:根据用户输入选择合适的工具。
  3. **​​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)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

四、总结

通过这篇文章,我们从零开始搭建了一个AI智能体。完成了环境搭建、模型定义、工具创建、工具箱构建,并最终让智能体运行起来。这种结构化的搭建方式为创建智能、交互式的智能体奠定了坚实基础。

随着AI智能体的不断发展,它们的应用场景将扩展到更多行业,推动效率和创新。未来,我们将继续探索更多功能,让智能体变得更强大、更智能。敬请期待!


本文转载自公众号Halo咯咯    作者:基咯咯

原文链接:​​https://mp.weixin.qq.com/s/Yq7FckZgv-zgj0KIu3xnVg​

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2025-3-24 10:37:32修改
收藏
回复
举报


回复
相关推荐