从零构建AI智能体:小白程序员必备收藏指南
智能体是一个自主实体,能够感知其环境、做出决策并采取行动以实现特定目标。智能体的复杂性各不相同,从简单的反应式智能体(对刺激做出直接响应)到更先进的智能体(能够学习和适应)。反应式智能体:直接对环境变化做出响应,没有内部记忆。基于模型的智能体:使用内部世界模型进行决策。基于目标的智能体:根据实现特定目标来规划行动。基于效用的智能体:根据效用函数评估潜在行动,以最大化结果。例如,聊天机器人、推荐系统
从零构建AI智能体:小白程序员必备收藏指南
本文详细介绍了如何使用Python从零构建一个能根据用户输入做出决策、选择并执行合适工具的智能体。内容涵盖智能体概念、类型、Python环境设置、Ollama语言模型安装及核心组件实现。通过实例讲解模型类、工具函数、工具箱和智能体类的构建,最后展示智能体整合运行,让用户指令与相应工具的匹配。适合想学习AI智能体构建的程序员和小白参考。
1、 什么是智能体?
智能体是一个自主实体,能够感知其环境、做出决策并采取行动以实现特定目标。智能体的复杂性各不相同,从简单的反应式智能体(对刺激做出直接响应)到更先进的智能体(能够学习和适应)。常见的智能体类型包括:
- 反应式智能体:直接对环境变化做出响应,没有内部记忆。
- 基于模型的智能体:使用内部世界模型进行决策。
- 基于目标的智能体:根据实现特定目标来规划行动。
- 基于效用的智能体:根据效用函数评估潜在行动,以最大化结果。
例如,聊天机器人、推荐系统和自动驾驶汽车都利用不同类型的智能体高效、智能地完成任务。
我们的智能体的核心组件包括:
- 模型:智能体的“大脑”,负责处理输入并生成响应。
- 工具:智能体可以根据用户请求执行的预定义函数。
- 工具箱:智能体可以使用的工具集合。
- 系统提示:指导智能体如何处理用户输入并选择正确工具的指令集。
2、实现
现在,让我们开始动手构建!
2.1 前置条件

本教程的完整代码可在AI智能体GitHub仓库中找到,https://github.com/vsingh9076/AI-Agents/tree/main/build-agent-from-scratch
在运行代码之前,请确保你的系统满足以下前置条件:
1. Python环境设置
你需要安装Python才能运行AI智能体。按照以下步骤设置环境:
- 安装Python(如果尚未安装)
- 从python.org下载并安装Python(推荐3.8及以上版本)。
- 验证安装:
python --version
- 创建虚拟环境(推荐)
- 最好使用虚拟环境来管理依赖项:
python -m venv ai_agents_env
source ai_agents_env/bin/activate # Windows: ai_agents_env\Scripts\activate
- 安装所需依赖
- 进入仓库目录并安装依赖项:
pip install-r requirements.txt
2. 本地设置Ollama
Ollama用于高效运行和管理本地语言模型。按照以下步骤安装并配置它:
- 下载并安装Ollama
- 访问Ollama官网,下载适用于你操作系统的安装程序。
- 按照平台说明进行安装。
- 验证Ollama安装
- 运行以下命令检查Ollama是否安装正确:
ollama --version
- 拉取模型(如果需要)
- 某些智能体实现可能需要特定模型。你可以使用以下命令拉取模型:
ollama pull mistral # 将'mistral'替换为所需模型
2.2 实现步骤

第1步:设置环境
除了Python外,我们还需要安装一些必要的库。在本教程中,我们将使用requests、json和termcolor。此外,我们将使用dotenv来管理环境变量。
pip install requests termcolor python-dotenv
第2步:定义模型类
我们需要的第一个组件是一个能够处理用户输入的模型。我们将创建一个OllamaModel类,它通过本地API与模型交互以生成响应。
以下是基本实现:
class OllamaModel:
def __init__(self, model, system_prompt, temperature=0, stop=None):
"""
Initializes the OllamaModel with the given parameters.
Parameters:
model (str): The name of the model to use.
system_prompt (str): The system prompt to use.
temperature (float): The temperature setting for the model.
stop (str): The stop token for the model.
"""
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):
"""
Generates a response from the Ollama model based on the provided prompt.
Parameters:
prompt (str): The user query to generate a response for.
Returns:
dict: The response from the model as a dictionary.
"""
payload ={"model": self.model,
"format":"json",
"prompt": prompt,
"system": self.system_prompt,
"stream": False,
"temperature": self.temperature,
"stop": self.stop
}
try:
request_response = requests.post(
self.model_endpoint,
headers=self.headers,
data=json.dumps(payload))
print("REQUEST RESPONSE", request_response)
request_response_json = request_response.json()
response = request_response_json['response']
response_dict = json.loads(response)
print(f"\n\nResponse from Ollama model: {response_dict}")return response_dict
except requests.RequestException as e:
response ={"error": f"Error in invoking model! {str(e)}"}return response
这个类使用模型名称、系统提示、温度和停止标记进行初始化。generate_text方法向模型API发送请求并返回响应。
第3步:为智能体创建工具
下一步是为智能体创建可以使用的工具。这些工具是执行特定任务的简单Python函数。以下是一个基本计算器和字符串反转器的示例:
def basic_calculator(input_str):
"""
Perform a numeric operation on two numbers based on the input string or dictionary.
Parameters:
input_str (str or dict): Either a JSON string representing a dictionary with keys 'num1', 'num2', and 'operation',
or a dictionary directly. Example: '{"num1": 5, "num2": 3, "operation": "add"}'
or {"num1":67869, "num2":9030393, "operation":"divide"}
Returns:
str: The formatted result of the operation.
Raises:
Exception: If an error occurs during the operation (e.g., division by zero).
ValueError: If an unsupported operation is requested or input is invalid.
"""
try:
# Handle both dictionary and string inputsif isinstance(input_str, dict):
input_dict = input_str
else:
# Clean and parse the input string
input_str_clean = input_str.replace("'", "\"")
input_str_clean = input_str_clean.strip().strip("\"")
input_dict = json.loads(input_str_clean)# Validate required fields
ifnot all(key in input_dict forkeyin['num1', 'num2', 'operation']):
return"Error: Input must contain 'num1', 'num2', and 'operation'"
num1 = float(input_dict['num1'])# Convert to float to handle decimal numbers
num2 = float(input_dict['num2'])
operation = input_dict['operation'].lower()# Make case-insensitive
except (json.JSONDecodeError, KeyError) as e:
return"Invalid input format. Please provide valid numbers and operation."
except ValueError as e:
return"Error: Please provide valid numerical values."# Define the supported operations with error handling
operations ={'add': operator.add,
'plus': operator.add, # Alternative word for add'subtract': operator.sub,
'minus': operator.sub, # Alternative word for subtract'multiply': operator.mul,
'times': operator.mul, # Alternative word for multiply'divide': operator.truediv,
'floor_divide': operator.floordiv,
'modulus': operator.mod,
'power': operator.pow,
'lt': operator.lt,
'le': operator.le,
'eq': operator.eq,
'ne': operator.ne,
'ge': operator.ge,
'gt': operator.gt
}# Check if the operation is supportedif operation notin operations:
returnf"Unsupported operation: '{operation}'. Supported operations are: {', '.join(operations.keys())}"
try:
# Special handling for division by zeroif(operation in['divide', 'floor_divide', 'modulus']) and num2 ==0:
return"Error: Division by zero is not allowed"# Perform the operation
result = operations[operation](num1, num2)# Format result based on typeif isinstance(result, bool):
result_str ="True"if result else"False"elif isinstance(result, float):
# Handle floating point precision
result_str = f"{result:.6f}".rstrip('0').rstrip('.')
else:
result_str = str(result)
returnf"The answer is: {result_str}"
except Exception as e:
returnf"Error during calculation: {str(e)}"
def reverse_string(input_string):
"""
Reverse the given string.
Parameters:
input_string (str): The string to be reversed.
Returns:
str: The reversed string.
"""
# Check if input is a string
ifnot isinstance(input_string, str):
return"Error: Input must be a string"# Reverse the string using slicing
reversed_string = input_string[::-1]# Format the output
result = f"The reversed string is: {reversed_string}"return result
这些函数根据输入执行特定任务。basic_calculator处理算术运算,而reverse_string反转给定字符串。
第4步:构建工具箱
ToolBox类存储智能体可以使用的工具,并为每个工具提供描述:
class ToolBox:
def __init__(self):
self.tools_dict ={}
def store(self, functions_list):
"""
Stores the literal name and docstring of each functionin the list.
Parameters:
functions_list (list): List of function objects to store.
Returns:
dict: Dictionary with function names as keys and their docstrings as values.
"""
forfuncin functions_list:
self.tools_dict[func.__name__]= func.__doc__
return self.tools_dict
def tools(self):
"""
Returns the dictionary created in store as a text string.
Returns:
str: Dictionary of stored functions and their docstrings as a text string.
"""
tools_str =""for name, doc in self.tools_dict.items():
tools_str += f"{name}: \"{doc}\"\n"return tools_str.strip()
这个类将帮助智能体了解可用的工具及其功能。
第5步:创建智能体类
智能体需要思考、决定使用哪个工具并执行它。以下是Agent类:
agent_system_prompt_template ="""
You are an intelligent AI assistant with access to specific tools. Your responses must ALWAYS be in this JSON format:
{{"tool_choice":"name_of_the_tool",
"tool_input":"inputs_to_the_tool"}}
TOOLS AND WHEN TO USE THEM:
1. basic_calculator: Use for ANY mathematical calculations
- Input format: {{"num1": number, "num2": number, "operation":"add/subtract/multiply/divide"}}
- Supported operations: add/plus, subtract/minus, multiply/times, divide
- Example inputs and outputs:
Input: "Calculate 15 plus 7"
Output: {{"tool_choice":"basic_calculator", "tool_input":{{"num1":15, "num2":7, "operation":"add"}}}}
Input: "What is 100 divided by 5?"
Output: {{"tool_choice":"basic_calculator", "tool_input":{{"num1":100, "num2":5, "operation":"divide"}}}}2. reverse_string: Use for ANY request involving reversing text
- Input format: Just the text to be reversed as a string
- ALWAYS use this tool when user mentions "reverse", "backwards", or asks to reverse text
- Example inputs and outputs:
Input: "Reverse of 'Howwwww'?"
Output: {{"tool_choice":"reverse_string", "tool_input":"Howwwww"}}
Input: "What is the reverse of Python?"
Output: {{"tool_choice":"reverse_string", "tool_input":"Python"}}3. no tool: Use for general conversation and questions
- Example inputs and outputs:
Input: "Who are you?"
Output: {{"tool_choice":"no tool", "tool_input":"I am an AI assistant that can help you with calculations, reverse text, and answer questions. I can perform mathematical operations and reverse strings. How can I help you today?"}}
Input: "How are you?"
Output: {{"tool_choice":"no tool", "tool_input":"I'm functioning well, thank you for asking! I'm here to help you with calculations, text reversal, or answer any questions you might have."}}
STRICT RULES:
1. For questions about identity, capabilities, or feelings:
- ALWAYS use "no tool"
- Provide a complete, friendly response
- Mention your capabilities
2. For ANY text reversal request:
- ALWAYS use "reverse_string"
- Extract ONLY the text to be reversed
- Remove quotes, "reverse of", and other extra text
3. For ANY math operations:
- ALWAYS use "basic_calculator"
- Extract the numbers and operation
- Convert text numbers to digits
Here is a list of your tools along with their descriptions:
{tool_descriptions}
Remember: Your response must ALWAYS be valid JSON with "tool_choice" and "tool_input" fields.
"""
class Agent:
def __init__(self, tools, model_service, model_name, stop=None):
"""
Initializes the agent with a list of tools and a model.
Parameters:
tools (list): List of tool functions.
model_service (class): The model service class with a generate_text method.
model_name (str): The name of the model to use.
"""
self.tools = tools
self.model_service = model_service
self.model_name = model_name
self.stop = stop
def prepare_tools(self):
"""
Stores the tools in the toolbox and returns their descriptions.
Returns:
str: Descriptions of the tools stored in the toolbox.
"""
toolbox = ToolBox()
toolbox.store(self.tools)
tool_descriptions = toolbox.tools()return tool_descriptions
def think(self, prompt):
"""
Runs the generate_text method on the model using the system prompt template and tool descriptions.
Parameters:
prompt (str): The user query to generate a response for.
Returns:
dict: The response from the model as a dictionary.
"""
tool_descriptions = self.prepare_tools()
agent_system_prompt = agent_system_prompt_template.format(tool_descriptions=tool_descriptions)# Create an instance of the model service with the system promptif self.model_service == OllamaModel:
model_instance = self.model_service(model=self.model_name,
system_prompt=agent_system_prompt,
temperature=0,
stop=self.stop
)
else:
model_instance = self.model_service(model=self.model_name,
system_prompt=agent_system_prompt,
temperature=0)# Generate and return the response dictionary
agent_response_dict = model_instance.generate_text(prompt)return agent_response_dict
def work(self, prompt):
"""
Parses the dictionary returned from think and executes the appropriate tool.
Parameters:
prompt (str): The user query to generate a response for.
Returns:
The response from executing the appropriate tool or the tool_input if no matching tool is found.
"""
agent_response_dict = self.think(prompt)
tool_choice = agent_response_dict.get("tool_choice")
tool_input = agent_response_dict.get("tool_input")fortoolin 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:执行选定的工具并返回结果。
第6步:运行智能体
最后,让我们将所有内容整合在一起并运行智能体。在脚本的主部分中,初始化智能体并开始接受用户输入:
# 示例用法if __name__ =="__main__":"""
使用此智能体的说明:
你可以尝试以下示例查询:
1. 计算器操作:
- "Calculate 15 plus 7"
- "What is 100 divided by 5?"
- "Multiply 23 and 4"2. 字符串反转:
- "Reverse the word 'hello world'"
- "Can you reverse 'Python Programming'?"3. 一般性问题(将直接获得响应):
- "Who are you?"
- "What can you help me with?"
Ollama命令(在终端中运行):
- 查看可用模型: 'ollama list'
- 查看正在运行的模型:'ps aux | grep ollama'
- 列出模型标签: 'curl http://localhost:11434/api/tags'
- 拉取新模型: 'ollama pull mistral'
- 运行模型服务器: 'ollama serve'"""
tools =[basic_calculator, reverse_string]# 如果使用OpenAI,请取消以下注释# model_service = OpenAIModel# model_name = 'gpt-3.5-turbo'# stop = None# 使用Ollama和llama2模型
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)
print("\n欢迎使用AI智能体!输入'exit'退出。")
print("你可以要求我:")
print("1. 执行计算(例如:'Calculate 15 plus 7')")
print("2. 反转字符串(例如:'Reverse hello world')")
print("3. 回答一般性问题\n")
whileTrue:
prompt = input("问我任何问题:")if prompt.lower()=="exit":break
agent.work(prompt)
3、结论
在本篇博客中,我们从理解什么是智能体开始,逐步实现了智能体。我们搭建了环境,定义了模型,创建了必要的工具,并构建了一个结构化的工具箱来支持智能体的功能。最后,我们将所有内容整合在一起并运行了智能体。
最后
近期科技圈传来重磅消息:行业巨头英特尔宣布大规模裁员2万人,传统技术岗位持续萎缩的同时,另一番景象却在AI领域上演——AI相关技术岗正开启“疯狂扩招”模式!据行业招聘数据显示,具备3-5年大模型相关经验的开发者,在大厂就能拿到50K×20薪的高薪待遇,薪资差距肉眼可见!

业内资深HR预判:不出1年,“具备AI项目实战经验”将正式成为技术岗投递的硬性门槛。在行业迭代加速的当下,“温水煮青蛙”式的等待只会让自己逐渐被淘汰,与其被动应对,不如主动出击,抢先掌握AI大模型核心原理+落地应用技术+项目实操经验,借行业风口实现职业翻盘!
深知技术人入门大模型时容易走弯路,我特意整理了一套全网最全最细的大模型零基础学习礼包,涵盖入门思维导图、经典书籍手册、从入门到进阶的实战视频、可直接运行的项目源码等核心内容。这份资料无需付费,免费分享给所有想入局AI大模型的朋友!

👇👇扫码免费领取全部内容👇👇

部分资料展示
1、 AI大模型学习路线图

2、 全套AI大模型应用开发视频教程
从入门到进阶这里都有,跟着老师学习事半功倍。

3、 大模型学习书籍&文档

4、 AI大模型最新行业报告
2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

5、大模型大厂面试真题
整理了百度、阿里、字节等企业近三年的AI大模型岗位面试题,涵盖基础理论、技术实操、项目经验等维度,每道题都配有详细解析和答题思路,帮你针对性提升面试竞争力。


6、大模型项目实战&配套源码
学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
- 👇👇扫码免费领取全部内容👇👇

这些资料真的有用吗?
这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

更多推荐



所有评论(0)