使用python開發(fā)一個可調用工具的AI智能體
在人工智能時代,AI Agent憑借其強大的任務處理能力,逐漸成為開發(fā)人員手中的得力工具。今天,我們就來一起動手,用Python打造一個能夠調用工具的AI Agent,實現(xiàn)根據(jù)電腦信息對電腦配置進行專業(yè)評價的功能。
一、項目創(chuàng)建與目錄結構
1.1 項目創(chuàng)建
首先,我們需要創(chuàng)建一個新的項目環(huán)境。這里使用UV進行項目創(chuàng)建。
uv init demo
項目創(chuàng)建完成后,進入項目文件夾并安裝必要的包, 比如安裝psutil
uv add psutil
安裝的包都會記錄在pypoject.toml, 看看我都安裝了哪些包
[project]
name = "demo"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"psutil>=7.0.0",
"pydantic-ai>=0.2.16",
"python-dotenv>=1.1.0",
"setuptools>=80.9.0",
]
1.2 目錄結構
我們的項目目錄結構如下:
demo
├── .venv
├──.env
├──.gitignore
├──.python-version
├── main.py
├── pyproject.toml
├── README.md
├── tools.py
├── uv.lock
可以看到除了創(chuàng)建項目時uv自動創(chuàng)建的文件及文件夾,這個項目我主要創(chuàng)建了3個文件:
main.py:項目的主程序文件,負責整個AI Agent的運行邏輯,包括模型初始化、與AI交互以及結果處理等核心功能。tools.py:存放讀取電腦配置信息的工具函數(shù),為main.py提供電腦配置數(shù)據(jù)支持。.env:用于存儲敏感信息,此項目主要存儲了OPENROUTER_API_KEY,保證API密鑰的安全,避免在代碼中直接暴露。
二、功能實現(xiàn)與代碼解析
2.1 讀取電腦配置信息(tools.py)
在tools.py文件中,我定義了read_pc_info函數(shù),用于獲取電腦的詳細配置信息。該函數(shù)的實現(xiàn)依賴platform和psutil庫。
import platform
import psutil
def read_pc_info():
# 獲取系統(tǒng)信息
info = []
# CPU信息
info.append(f"CPU: {platform.processor()}")
info.append(f"CPU Cores: {psutil.cpu_count(logical=False)} physical, {psutil.cpu_count(logical=True)} logical")
# 內存信息
mem = psutil.virtual_memory()
info.append(f"RAM: {mem.total / (1024**3):.1f} GB (Available: {mem.available / (1024**3):.1f} GB)")
# 磁盤信息
partitions = psutil.disk_partitions()
for p in partitions:
if p.fstype:
usage = psutil.disk_usage(p.mountpoint)
info.append(f"Disk {p.device}: {usage.total / (1024**3):.1f} GB ({usage.percent}% used)")
# 操作系統(tǒng)信息
info.append(f"OS: {platform.system()} {platform.release()}")
return "\n".join(info)
- CPU信息獲取:使用
platform.processor()獲取CPU型號,psutil.cpu_count(logical=False)獲取物理核心數(shù),psutil.cpu_count(logical=True)獲取邏輯核心數(shù)。 - 內存信息獲取:通過
psutil.virtual_memory()獲取系統(tǒng)內存相關信息,包括總內存和可用內存,并進行單位換算后添加到info列表。 - 磁盤信息獲取:
psutil.disk_partitions()獲取磁盤分區(qū)信息,遍歷分區(qū),使用psutil.disk_usage(p.mountpoint)獲取每個分區(qū)的使用情況,添加到info列表。 - 操作系統(tǒng)信息獲取:
platform.system()獲取操作系統(tǒng)名稱,platform.release()獲取操作系統(tǒng)版本號,將其組合添加到info列表。最后,將info列表中的所有信息以換行符連接成字符串返回。
2.2 主程序邏輯(main.py)
在main.py文件中,包含了項目的核心運行邏輯。
2.2.1 導入需要的庫和定義系統(tǒng)提示詞
import os from typing import Optional, Tuple from dotenv import load_dotenv from openai import OpenAI from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider from tools import read_pc_info import logging # 系統(tǒng)提示詞定義 SYSTEM_PROMPT = """ 你是一位專業(yè)的電腦硬件評測專家,擅長分析電腦配置的性能、適用性和升級潛力。你能夠根據(jù)用戶提供的電腦配置信息,給出專業(yè)、實用的評價和建議。請以簡潔明了的語言表達觀點,既要考慮技術細節(jié),也要考慮普通用戶的理解能力。 """
這里先導入了項目所需的各種庫,定義了SYSTEM_PROMPT常量,用于設定AI Agent的角色和能力,讓其以專業(yè)電腦硬件評測專家的身份進行回答。
2.2.2 獲取API配置
def get_api_config() -> Tuple[str, str]:
"""獲取OpenRouter API配置
返回:
Tuple[str, str]: (api_key, base_url) API密鑰和基礎URL
異常:
ValueError: 當API密鑰未設置時
EnvironmentError: 當.env文件加載失敗時
"""
try:
if not load_dotenv():
logging.warning(".env文件未找到或加載失敗")
api_key = os.getenv("OPENROUTER_API_KEY")
base_url = 'https://openrouter.ai/api/v1'
if not api_key:
raise ValueError("請在.env文件中設置OPENROUTER_API_KEY")
return api_key, base_url
except Exception as e:
logging.error(f"獲取API配置失敗: {e}")
raise
該函數(shù)負責從.env文件中加載OPENROUTER_API_KEY,并返回API密鑰和base_url(因為我用的是openrouter里的模型,所以需要base_url這個參數(shù))。 如果.env文件加載失敗或API密鑰未設置,會拋出相應的異常。
2.2.2 初始化模型
def initialize_model() -> OpenAIModel:
"""初始化AI大模型實例
返回:
OpenAIModel: 初始化好的模型實例
異常:
RuntimeError: 當模型初始化失敗時
"""
try:
api_key, base_url = get_api_config()
provider = OpenAIProvider(base_url=base_url, api_key=api_key)
return OpenAIModel(
'qwen/qwen-2.5-72b-instruct:free',
provider=provider
)
except Exception as e:
logging.error(f"模型初始化失敗: {e}")
raise RuntimeError("無法初始化AI模型") from e
此函數(shù)通過調用get_api_config獲取API配置,然后使用OpenAIProvider和指定的模型名稱(這里我選的是免費的qwen/qwen-2.5-72b-instruct:free)初始化OpenAIModel實例。如果初始化過程中出現(xiàn)錯誤,會記錄錯誤日志并拋出RuntimeError。
2.2.4 主函數(shù)邏輯
def main():
# 配置日志記錄
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
try:
model = initialize_model()
logging.info("AI模型初始化成功")
except Exception as e:
logging.error(f"連接大模型錯誤: {e}")
return
try:
pc_info = read_pc_info()
logging.info("成功獲取電腦配置信息")
logging.info("電腦配置信息:\n" + pc_info)
except Exception as e:
logging.error(f"獲取配置信息出錯: {e}")
return
# 構建用戶提示詞
user_prompt = f"""
我需要您對這臺電腦的配置進行全面評價。請分析以下幾點:
1. 這臺電腦的性能是否能夠滿足日常辦公、網(wǎng)頁瀏覽、視頻播放等基本需求
2. 是否適合運行更復雜的應用程序,如視頻編輯、游戲或編程
3. 從性價比角度考慮,是否有必要升級某些硬件組件
4. 如果需要升級,您推薦升級哪些組件,預算大約是多少
5. 如果不值得升級,您認為在什么情況下應該考慮更換新電腦
按照指定格式給出專業(yè)評測:
1. 使用簡潔清晰的中文回答;
2. 回答必須使用標準 Markdown 格式,例如:## 標題、- 列表項;
3. 不要包含任何亂碼、HTML 標簽、JavaScript 代碼或特殊符號;
4. 避免出現(xiàn)“(注:...)”這類解釋性括號內容;
5. 輸出應易于閱讀且結構清晰。
以下是我的電腦配置信息:
{pc_info}
"""
# 創(chuàng)建AI代理
agent = Agent(
model,
system_prompt=SYSTEM_PROMPT
)
# 調用模型獲取評價
response = agent.run_sync(user_prompt)
# 打印結果
logging.info("電腦配置評價結果:")
logging.info(response)
if __name__ == "__main__":
main()
在main函數(shù)中:
- 首先配置日志記錄,設置日志級別為
INFO,指定日志格式。 - 調用
initialize_model初始化AI模型,若成功則記錄日志,失敗則記錄錯誤日志并返回。 - 調用
read_pc_info獲取電腦配置信息,成功則記錄配置信息日志,失敗記錄錯誤日志并返回。 - 根據(jù)獲取的電腦配置信息構建
user_prompt,明確告知AI Agent需要評價的內容和格式要求。 - 使用初始化的模型和
SYSTEM_PROMPT創(chuàng)建Agent實例。 - 通過
agent.run_sync(user_prompt)調用AI Agent,傳入用戶提示詞,獲取電腦配置評價的響應。 - 最后獲得返回的結果
三、結果展示
運行該項目后,在控制臺會輸出電腦配置信息獲取過程、AI 模型交互過程的日志信息,最終展示處理后的電腦配置評價結果。
工具(read_pc_info函數(shù))獲得的信息

將工具獲得的信息和提示詞給大模型后,大模型返回的結果

因為提示詞中我們說明了要Markdown格式,所以把‘\n’轉成實際的換行,就更容易讀了
## 電腦配置詳細評測
### 1. 基本需求
根據(jù)您提供的配置信息,以下是對這臺電腦性能的分析:
- **CPU**:Intel64 Family 6 Model 142 Stepping 10, 4核心8線程,這是一顆中等檔次的處理器,型號可能是Intel Core i5-8250U(根據(jù)提供的信息推測)。對于日常辦公、網(wǎng)頁瀏覽和視頻播放等基本需求來說,這塊處理器已經(jīng)非常足夠,能夠保證流暢的使用體驗。
- **內存**:19GB,但可用的為8GB。內存方面有些不足,8GB對于現(xiàn)代操作系統(tǒng)和多任務處理來說略顯緊張。建議將內存提升至16GB,這將顯著改善多任務處理能力和軟件運行效率。
- **硬盤**:三個硬盤分區(qū),C盤200GB已用66.1%,表明系統(tǒng)分區(qū)負載較重。D盤和E盤相對空閑,仍可滿足存儲需求。
- **OS**:Windows 11 對系統(tǒng)性能有一定需求,您的電腦配置可以支持,但會感覺到一些性能瓶頸,尤其是在內存方面。
### 2. 復雜應用程序
- **視頻編輯**:這塊CPU和8GB內存對于視 頻編輯來說有些吃力,處理高清視頻時可能會遇到卡頓和較高的延遲,不推薦用于專業(yè)視頻編輯。
- **游戲**:沒有提供顯卡信息,保守估計內置集顯(如Intel UHD Graphics 620)。對于要求不高的游戲,該配置勉強可以運行,但無法流暢玩大型3D游戲。
- **編程**:日常編寫代碼和運行輕量級開發(fā)環(huán)境(如Web開發(fā))可以勝任,但在處理大型項 目或資源密集型編譯時可能會感到力不從心。
### 3. 性價比與升級建議
從性價比角度來看,對這臺電腦硬件 進行合理升級可以提高其性能和使用壽命,建議如下:
- **內存升級**:將內存從8GB提升至16GB或更高,成本相 對較低但效果顯著,預算約為300-500元。
- **SSD**:如果C盤使用的是HDD,考慮更換為1TB或更大容量的NVMe SSD ,這將大幅提升系統(tǒng)的啟動速度和程序加載速度,預算約800-1500元。
### 4. 升級推薦
- **升級內存**:增 加至16GB,預算300-500元。
- **升級SSD**:如果目前使用的是HDD,強烈建議更換為1TB NVMe SSD,以極大地提高 數(shù)據(jù)讀寫速度,預算800-1500元。
### 5. 更換新電腦
如果上述升級措施仍無法滿足您的需求,或者您希望獲 得更高的性能和更長的使用壽命,建議考慮替換整機,特別是當您需要進行高負載的工作(如專業(yè)視頻編輯、3D建模和高端游戲)時。更換新電腦的情況包括:
- **性能瓶頸**:盡管通過硬件升級,整體性能有所提升,但在某些特定任務中仍然感覺卡頓或延遲較高。
- **技術落伍**:當前的硬件架構已經(jīng)無法支持最新的軟件和技術,如AI加速、實時光線追蹤等。
- **性價比過低**:升級的成本已經(jīng)接近于購買新電腦,或者升級后的性能提升不明顯。
我們創(chuàng)建的AI Agent就完成了。
我試了幾個openrouter支持調用工具的免費大模型,只有這個大模型說對了CPU型號,但是它對內存的評價不是很準確,雖然明知道是20G內存,其中8G可用,還建議我升級到16G(我的電腦運行了太多的程序,打開了太多的網(wǎng)頁,所以20G的內存,只剩8G可用)。因為我們的工具沒有給出硬盤的詳細型號,所以大模型給的建議參考價值就不大了,看來要改進工具函數(shù)獲取更詳細的信息。
四、項目總結與優(yōu)化方向
這個項目展示了如何使用Python創(chuàng)建一個能夠調用工具的AI Agent,實現(xiàn)電腦配置的自動評估。通過結合系統(tǒng)工具與大語言模型的能力,我們構建了一個簡單但實用的應用場景。
在實際使用中,我發(fā)現(xiàn)大模型在某些方面的判斷還不夠準確,比如對內存的評估就沒有考慮到當前系統(tǒng)的負載情況。這也提醒我們,即使是強大的AI模型,也需要合理的提示詞設計和數(shù)據(jù)預處理,才能得到更準確的結果。當然,另一方也需要工具能夠提供盡可能詳細的信息給到大模型,才能幫助大模型做出更準備的判斷和更有價值的建議。
未來,我們可以從以下幾個方面優(yōu)化這個項目:
- 增強工具功能:可以添加更多的系統(tǒng)信息收集功能,如GPU信息、網(wǎng)絡速度測試等
- 改進提示詞:針對大模型可能出現(xiàn)的誤解,優(yōu)化提示詞設計,提供更明確的指導
- 多模型對比:增加模型選擇功能,對比不同模型的輸出結果,選擇最準確的評估
- 用戶交互優(yōu)化:添加圖形界面或Web界面,提升用戶體驗
- 增加評估維度:除了硬件性能,還可以評估系統(tǒng)健康狀態(tài)、安全配置等方面
通過這個項目,我們不僅學習了如何構建一個AI Agent,更重要的是理解了如何將大模型與實際工具結合,創(chuàng)造出真正有價值的應用。AI Agent的潛力巨大,隨著技術的不斷發(fā)展,我們可以期待更多創(chuàng)新應用的出現(xiàn)。
以上就是使用python開發(fā)一個可調用工具的AI智能體的詳細內容,更多關于python AI智能體的資料請關注腳本之家其它相關文章!
相關文章
解決pymysql cursor.fetchall() 獲取不到數(shù)據(jù)的問題
這篇文章主要介紹了解決pymysql cursor.fetchall() 獲取不到數(shù)據(jù)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Django使用Channels實現(xiàn)WebSocket的方法
WebSocket是一種在單個TCP連接上進行全雙工通訊的協(xié)議。WebSocket允許服務端主動向客戶端推送數(shù)據(jù)。這篇文章主要介紹了Django使用Channels實現(xiàn)WebSocket,需要的朋友可以參考下2019-07-07
tensorflow 獲取所有variable或tensor的name示例
今天小編就為大家分享一篇tensorflow 獲取所有variable或tensor的name示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01

