AI Agents-2 | 手把手教你:從零開始打造AI智能體 原創(chuàng)
這個系列文章旨在為AI代理(AI Agent)提供全面的概述,深入研究其特征,組成部分和類型,同時探索其進化,挑戰(zhàn)和潛在的未來方向。
在??上一篇文章??中,我們深入探討了AI智能體的特性、組成、演變、挑戰(zhàn)以及未來可能性。今天,我們要更進一步,手把手教你用Python從零搭建一個AI智能體。這個智能體可以根據(jù)用戶輸入做出決策,選擇合適的工具,并執(zhí)行相應任務。話不多說,讓我們立刻開始吧!
一、什么是AI智能體?
簡單來說,AI智能體就是一個能夠自主感知環(huán)境、做出決策并采取行動以實現(xiàn)特定目標的實體。智能體的復雜程度千差萬別,從簡單地對刺激做出反應的智能體,到能夠?qū)W習并隨時間適應的高級智能體,種類繁多。
常見的智能體類型有:
- 反應型智能體:直接對環(huán)境變化做出反應,沒有內(nèi)部記憶。
- 基于模型的智能體:利用內(nèi)部的世界模型來做出決策。
- 目標型智能體:根據(jù)特定目標規(guī)劃行動。
- 效用型智能體:基于效用函數(shù)評估潛在行動,以最大化結(jié)果。
具體例子包括聊天機器人、推薦系統(tǒng)和自動駕駛汽車,它們各自利用不同類型的智能體高效、智能地完成任務。
我們今天要搭建的智能體,核心組件包括:
- 模型:智能體的“大腦”,負責處理輸入并生成響應。
- 工具:智能體可以根據(jù)用戶請求執(zhí)行的預定義函數(shù)。
- 工具箱:智能體可以使用的工具集合。
- 系統(tǒng)提示:指導智能體如何處理用戶輸入并選擇合適工具的指令集。
二、搭建智能體的準備工作
在動手之前,先確保你的系統(tǒng)滿足以下條件:
(一)Python環(huán)境搭建
你需要安裝Python來運行AI智能體。以下是搭建環(huán)境的步驟:
1.安裝Python(推薦3.8及以上版本)訪問python.org,下載并安裝Python。驗證安裝是否成功:
python --version
2.創(chuàng)建虛擬環(huán)境(推薦)使用虛擬環(huán)境管理依賴項是個好習慣:
python -m venv ai_agents_env
source ai_agents_env/bin/activate # Windows系統(tǒng)用:ai_agents_env\Scripts\activate
3.安裝依賴項進入項目目錄后,安裝所需的依賴項:
pip install -r requirements.txt
(二)本地部署Ollama
Ollama是一個用于高效運行和管理本地語言模型的工具。以下是安裝和配置步驟:
1.下載并安裝Ollama訪問Ollama官網(wǎng),下載適合你操作系統(tǒng)的安裝包,并按照說明進行安裝。
2.驗證Ollama安裝運行以下命令檢查Ollama是否安裝成功:
ollama --version
3.拉取模型(如有需要)如果你的智能體實現(xiàn)需要特定模型,可以通過以下命令拉?。?/p>
ollama pull mistral # 將“mistral”替換為你需要的模型
三、搭建智能體的具體步驟
(一)搭建環(huán)境
除了Python,我們還需要安裝一些核心庫,比如??requests?
??、??json?
??和??termcolor?
??,此外,我們還會用到??dotenv?
?來管理環(huán)境變量。
pip install requests termcolor python-dotenv
(二)定義模型類
智能體需要一個模型來處理用戶輸入。我們將創(chuàng)建一個??OllamaModel?
?類,它通過本地API與模型交互并生成響應。以下是基礎(chǔ)實現(xiàn):
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,設(shè)置模型名稱、系統(tǒng)提示、溫度和停止標記。
"""
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):
"""
根據(jù)用戶輸入生成響應。
"""
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"調(diào)用模型時出錯!{str(e)}"}
這個類通過模型名稱、系統(tǒng)提示、溫度和停止標記初始化,并通過??generate_text?
?方法向模型API發(fā)送請求并返回響應。
(三)為智能體創(chuàng)建工具
接下來,我們需要為智能體創(chuàng)建一些工具。這些工具是簡單的Python函數(shù),用于執(zhí)行特定任務。比如一個基礎(chǔ)計算器和一個字符串反轉(zhuǎn)器:
import json
import operator
def basic_calculator(input_str):
"""
執(zhí)行兩個數(shù)字的數(shù)值運算。
"""
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"除數(shù)不能為零!"
result = operations[operation](num1, num2)
returnf"結(jié)果是:{result:.6f}".rstrip('0').rstrip('.')
except Exception as e:
returnf"計算出錯:{str(e)}"
def reverse_string(input_string):
"""
反轉(zhuǎn)字符串。
"""
ifnot isinstance(input_string, str):
return"輸入必須是字符串!"
reversed_string = input_string[::-1]
returnf"反轉(zhuǎn)后的字符串是:{reversed_string}"
(四)構(gòu)建工具箱
??ToolBox?
?類用于存儲智能體可以使用的工具,并為每個工具提供描述:
class ToolBox:
def __init__(self):
"""
初始化工具箱。
"""
self.tools_dict = {}
def store(self, functions_list):
"""
存儲工具函數(shù)的名稱和描述。
"""
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()
這個類可以幫助智能體了解可用的工具及其功能。
(五)創(chuàng)建智能體類
智能體需要思考、選擇合適的工具并執(zhí)行它。以下是??Agent?
?類的實現(xiàn):
agent_system_prompt_template = """
你是一個智能AI助手,可以調(diào)用以下工具。你的回答必須始終是以下JSON格式:
{{
"tool_choice": "工具名稱",
"tool_input": "工具輸入"
}}
工具列表及使用場景:
1. basic_calculator:用于任何數(shù)學計算
- 輸入格式:{{"num1": 數(shù)字, "num2": 數(shù)字, "operation": "加/減/乘/除"}}
- 示例:
輸入:"15加7"
輸出:{{"tool_choice": "basic_calculator", "tool_input": {{"num1": 15, "num2": 7, "operation": "add"}}}}
2. reverse_string:用于任何文本反轉(zhuǎn)請求
- 輸入格式:直接輸入需要反轉(zhuǎn)的文本
- 示例:
輸入:"反轉(zhuǎn)'Hello'"
輸出:{{"tool_choice": "reverse_string", "tool_input": "Hello"}}
3. no_tool:用于一般性對話或問題
- 示例:
輸入:"你是誰?"
輸出:{{"tool_choice": "no_tool", "tool_input": "我是你的AI助手,可以幫你計算數(shù)學題、反轉(zhuǎn)文本或回答問題。"}}
請記住:你的回答必須始終是有效的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):
"""
根據(jù)用戶輸入生成響應。
"""
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):
"""
解析響應并執(zhí)行工具。
"""
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?
?**:根據(jù)用戶輸入選擇合適的工具。 - **?
?work?
?**:執(zhí)行選定的工具并返回結(jié)果。
(六)運行智能體
最后,我們將所有組件組合起來,運行智能體。在腳本的主部分,初始化智能體并開始接受用戶輸入:
if __name__ == "__main__":
print("\n歡迎使用AI智能體!輸入'exit'退出。")
print("你可以讓我:")
print("1. 進行數(shù)學計算(例如:'15加7')")
print("2. 反轉(zhuǎn)字符串(例如:'反轉(zhuǎn)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)
四、總結(jié)
通過這篇文章,我們從零開始搭建了一個AI智能體。完成了環(huán)境搭建、模型定義、工具創(chuàng)建、工具箱構(gòu)建,并最終讓智能體運行起來。這種結(jié)構(gòu)化的搭建方式為創(chuàng)建智能、交互式的智能體奠定了堅實基礎(chǔ)。
隨著AI智能體的不斷發(fā)展,它們的應用場景將擴展到更多行業(yè),推動效率和創(chuàng)新。未來,我們將繼續(xù)探索更多功能,讓智能體變得更強大、更智能。敬請期待!
本文轉(zhuǎn)載自公眾號Halo咯咯 作者:基咯咯
