随着人工智能工具日益融入日常运营,各大组织对AI的投入持续增长。这股不间断的创新浪潮,正推动着市场对更高效、更可靠框架的迫切需求。意大利科技社区背后的初创公司 Datapizza,顺应这一趋势,隆重发布了其名为 Datapizza AI 的开源 GenAI Python 框架。
在构建由大型语言模型(LLM)驱动的智能体时,需要精心选择一个AI 技术栈:
- 语言模型:智能体的大脑核心。首要抉择是选择开源模型(如 Llama、DeepSeek、Phi)还是付费模型(如 ChatGPT、Claude、Gemini)。随后,根据具体的用例,还需考虑 LLM 的知识广度:是通用型(如维基百科般无所不知)还是特定主题型(如针对编程或金融领域进行微调)。
- LLM 引擎:负责运行语言模型,响应提示、推断含义并生成文本。简而言之,它创造了智能。目前最常用的引擎包括 OpenAI(ChatGPT)、Anthropic(Claude)、Google(Gemini),以及可在本地运行开源模型的 Ollama。
- AI 框架:扮演着编排层的角色,负责构建和管理工作流。换言之,框架必须对大型语言模型(LLM)生成的智能进行结构化处理,使其能够协同工作。目前,该领域由 LangChain、LLamaIndex 和 CrewAI 占据主导地位。而全新发布的库 Datapizza AI 正属于此类,旨在成为这些主流框架的有力替代品。
本文将展示如何利用全新的 Datapizza 框架构建由 LLM 驱动的 AI 智能体。文章提供了实用的 Python 代码示例,可轻松应用于类似场景(即取即用),并逐行附带注释,方便读者复现和理解。
设置
由于在本地主机上运行模型具有诸多优势,例如对数据隐私、模型行为和成本的完全控制,因此教程选择使用 Ollama 作为 LLM 引擎。
首先,需要从 Ollama 官网下载安装包。接着,选择一个模型并运行页面上指示的命令来拉取 LLM。文章选择使用阿里巴巴的 Qwen 模型,因其兼具智能性与轻量化优势(ollama run qwen3)。
Datapizza AI 支持所有主流 LLM 引擎。通过运行以下命令即可完成设置:
pip install datapizza-ai
pip install datapizza-ai-clients-openai-like
正如 官方文档 所述,可以快速测试 AI 技术栈,通过一个简单的提示调用模型并提出问题。OpenAILikeClient() 对象是连接 Ollama API 的方式,该 API 通常托管在同一本地主机 URL 上。
from datapizza.clients.openai_like import OpenAILikeClient
llm = "qwen3"
prompt = '''
You are an intelligent assistant, provide the best possible answer to user's request.
'''
ollama = OpenAILikeClient(api_key="", model=llm, system_prompt=prompt, base_url="http://localhost:11434/v1")
q = '''
what time is it?
'''
llm_res = ollama.invoke(q)
print(llm_res.text)

聊天机器人
测试 LLM 能力的另一种方式是构建一个简单的聊天机器人并进行对话。为此,在每次交互中,需要存储聊天历史并将其反馈给模型,明确每次对话是由谁说的。Datapizza 框架内置了强大的记忆系统。
from datapizza.memory import Memory
from datapizza.type import TextBlock, ROLE
memory = Memory()
memory.add_turn(TextBlock(content=prompt), role=ROLE.SYSTEM)
while True:
## 用户
q = input(' >')
if q == "quit":
break
## LLM
llm_res = ollama.invoke(q, memory=memory)
res = llm_res.text
print(" >", f"x1b[1;30m{res}x1b[0m")
## 更新记忆
memory.add_turn(TextBlock(content=q), role=ROLE.USER)
memory.add_turn(TextBlock(content=res), role=ROLE.ASSISTANT)

如果想检索聊天历史,只需访问记忆系统即可。通常,AI 框架在与 LLM 交互时使用三种角色:“系统”(核心指令)、“用户”(人类所说)、“助手”(聊天机器人回复)。
memory.to_dict()
显然,单纯的 LLM 功能非常有限,除了聊天之外无法完成太多任务。因此,需要赋予它执行行动的可能性,换言之,就是激活工具(Tools)。
工具
工具是区分普通 LLM 和 AI 智能体的关键所在。当用户提出超出 LLM 知识库范围的问题时(例如“现在几点?”),智能体应能理解它不知道答案,然后激活一个工具来获取额外信息(例如检查时钟),通过 LLM 处理结果,并生成答案。
Datapizza 框架允许用户极其便捷地从零开始创建工具。只需导入 @tool 装饰器,任何 Python 函数都可摇身一变,成为智能体可调用的行动模块。
from datapizza.tools import tool
@tool
def get_time() -> str:
'''获取当前时间。'''
from datetime import datetime
return datetime.now().strftime("%H:%M")
get_time()
随后,将指定工具分配给智能体,即可拥有一个结合了语言理解、自主决策和工具使用的 AI 系统。
from datapizza.agents import Agent
import os
os.environ["DATAPIZZA_AGENT_LOG_LEVEL"] = "DEBUG" # 最大日志级别
agent = Agent(name="single-agent", client=ollama, system_prompt=prompt,
tools=[get_time], max_steps=2)
q = '''
what time is it?
'''
agent_res = agent.run(q)

一个由 LLM 驱动的 AI 智能体,是一个围绕语言模型构建的智能系统,它不仅能响应指令,更具备推理、决策和执行行动的能力。除了对话(即与通用知识库聊天)之外,智能体最常见的行动包括 RAG(与文档对话)、查询(与数据库对话)和网络搜索(与整个互联网对话)。
例如,尝试一个网络搜索工具。在 Python 中,最简单的方法是使用著名的隐私浏览器 DuckDuckGo。可以直接使用 原始库 或 Datapizza 框架的封装器(pip install datapizza-ai-tools-duckduckgo)。
from datapizza.tools.duckduckgo import DuckDuckGoSearchTool
DuckDuckGoSearchTool().search(query="powell")

现在创建一个能够为执行网络搜索的智能体。如果希望它更具交互性,可以像为聊天机器人构建时那样来架构 AI。
os.environ["DATAPIZZA_AGENT_LOG_LEVEL"] = "ERROR" # 关闭日志
prompt = '''
You are a journalist. You must make assumptions, use your tool to research, make a guess, and formulate a final answer.
The final answer must contain facts, dates, evidences to support your guess.
'''
memory = Memory()
agent = Agent(name="single-agent", client=ollama, system_prompt=prompt,
tools=[DuckDuckGoSearchTool()],
memory=memory, max_steps=2)
while True:
## 用户
q = input(' >')
if q == "quit":
break
## 智能体
agent_res = agent.run(q)
res = agent_res.text
print(" >", f"x1b[1;30m{res}x1b[0m")
## 更新记忆
memory.add_turn(TextBlock(content=q), role=ROLE.USER)
memory.add_turn(TextBlock(content=res), role=ROLE.ASSISTANT)

多智能体系统
智能体真正的力量在于它们能够像人类一样彼此协作。这些协同工作的团队被称为 多智能体系统(Multi-Agent Systems, MAS),它们在共享环境中共同解决单个智能体难以独立处理的复杂问题。
这一次,创建一个更高级的工具:代码执行。需要注意的是,LLM 通过接触大量的代码和自然语言文本来学习如何编写代码,从而掌握编程语言的模式、语法和语义。但由于它们无法完成任何实际操作,所创建的代码仅是文本。简而言之,LLM 可以生成 Python 代码,但无法执行它,而智能体则可以。
import io
import contextlib
@tool
def code_exec(code:str) -> str:
'''执行 Python 代码。始终使用 print() 函数来获取输出。'''
output = io.StringIO()
with contextlib.redirect_stdout(output):
try:
exec(code)
except Exception as e:
print(f"Error: {e}")
return output.getvalue()
code_exec("from datetime import datetime; print(datetime.now().strftime('%H:%M'))")
多智能体系统有两种类型:顺序处理确保任务一个接一个地执行,遵循线性进展。另一方面,分层结构模拟传统的组织层级,以实现高效的任务委派和执行。后者通常能提供更高的并行度和灵活性,因而在实践中更受青睐。
借助 Datapizza 框架,可以使用 can_call() 函数将两个或更多智能体连接起来。通过这种方式,一个智能体可以将当前任务传递给另一个智能体。
prompt_senior = '''
您是一位高级 Python 编码员。您会检查初级编码员生成的代码,并仅在代码正确且安全的情况下使用您的工具执行它。
'''
agent_senior = Agent(name="agent-senior", client=ollama, system_prompt=prompt_senior,
tools=[code_exec])
prompt_junior = '''
您是一位初级 Python 编码员。您可以生成代码但无法执行它。
您会收到经理的请求,您的最终输出必须是可传递的 Python 代码。
如果您不知道某些特定命令,可以使用您的工具并在网上搜索“如何使用 Python 完成...?”。
'''
agent_junior = Agent(name="agent-junior", client=ollama, system_prompt=prompt_junior,
tools=[DuckDuckGoSearchTool()])
agent_junior.can_call([agent_senior])
prompt_manager = '''
您一无所知,只是一位经理。在收到用户请求后,您会首先要求初级编码员生成代码,然后要求高级编码员执行它。
'''
agent_manager = Agent(name="agent-manager", client=ollama, system_prompt=prompt_manager,
tools=[])
agent_manager.can_call([agent_junior, agent_senior])
q = '''
绘制泰坦尼克号数据集。数据可在此处找到:
https://raw.githubusercontent.com/mdipietro09/DataScience_ArtificialIntelligence_Utils/master/machine_learning/data_titanic.csv
'''
agent_res = agent_manager.run(q)
#print(agent_res.text)


总结
本文作为一篇教程,旨在介绍 Datapizza AI,这是一个构建由 LLM 驱动的聊天机器人和 AI 智能体的全新框架。该库展现出卓越的灵活性和用户友好性,能够覆盖各种生成式 AI 应用场景。虽然本文示例使用了 Ollama,但 Datapizza AI 可与 OpenAI 等所有主流 LLM 引擎无缝集成。
本文的完整代码可在:GitHub 获取。
