magentic
用 Python 装饰器将 LLM 调用变成强类型函数,AI 输出即 Pydantic 对象
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用 Python 装饰器将 LLM 调用变成强类型函数,AI 输出即 Pydantic 对象
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你正在开发一个数据分析助手,需要让 AI 模型按照你定义的数据结构返回结果。传统做法是让 AI 返回一段 JSON 文本,然后再写一堆正则表达式来解析它——这不是在编程,这是在和 AI 玩猜谜游戏。Magentic 解决的就是这个痛点:它让你用写 Python 函数的方式调用 LLM,AI 的输出直接就是结构化的 Python 对象。
Magentic 由独立开发者 Jack Collins 创建,项目始于 2023 年,目标非常纯粹——弥合 LLM 的自由输出与 Python 强类型系统之间的鸿沟。作者本身是 Python 开发者,深知类型注解、装饰器和 Pydantic 在 Python 生态中的地位,他将这些熟悉的工具引入 LLM 调用场景,让 AI 应用的开发体验回归 Python 程序员熟悉的范式。
在大语言模型应用开发领域,LangChain 曾是绝对主流,但其复杂抽象层和频繁的 breaking change 让许多开发者望而却步。Magentic 的出现代表了一种极简主义趋势——不需要那么重的框架,一行装饰器就够了。这种理念与 FastAPI 之于 Flask 的关系类似:用最小化的 API 暴露最大化的能力。
Magentic 的核心是 @prompt 和 @chatprompt 两个装饰器。当你写下:
from magentic import prompt
@prompt('翻译成法语: {phrase}')
def translate_french(phrase: str) -> str: ...
result = translate_french("Hello, world!") # 调用 LLM
这里的函数体是空的,函数永远不会被执行——真正起作用的是装饰器。当函数被调用时,Magentic 会:
更强大的能力在于 Pydantic 模型集成:
from magentic import prompt
from pydantic import BaseModel
class Weather(BaseModel):
city: str
temperature: float
condition: str
@prompt('查询 {city} 的天气')
def get_weather(city: str) -> Weather: ...
weather = get_weather("北京")
print(weather.city) # 北京
print(weather.temperature) # 23.5(已是 float 而非字符串)
这样 AI 返回的直接就是一个 Weather 实例,所有字段都是强类型的,甚至可以被 IDE 的自动补全所识别——这是 Magentic 与纯 prompt engineering 方案的本质区别。

图1:Magentic + Logfire 的追踪界面,展示 AI 函数调用的完整链路
Magentic 的代码结构体现了清晰的关注点分离:
| 模块 | 职责 |
|---|---|
| prompt_function.py | @prompt/@chatprompt 装饰器核心实现 |
| chat_model/ | 多 LLM 后端抽象(OpenAI/Anthropic/Ollama/Mistral 等) |
| _parsing.py | Pydantic 模型与 LLM 输出的解析逻辑 |
| function_call.py | 工具调用(Tool Use)机制 |
| streaming.py | 流式输出支持 |
| settings.py | 全局配置管理 |
这种架构的优势在于后端无关性——业务代码只依赖 Magentic 的装饰器接口,切换模型供应商(如从 GPT-4 切换到 Claude)只需修改一处配置,不需要改动业务逻辑代码。
Magentic 通过可选依赖支持多种 LLM 后端:
配置方式统一通过环境变量或 OpenaiChatModel() 构造函数指定,支持 Azure OpenAI Service、LocalAI 等自定义端点。这种灵活性让 Magentic 非常适合在开发阶段使用免费/便宜的模型,生产阶段切换到更强模型。
对于需要实时展示 AI 生成过程的应用(如打字机效果),Magentic 支持流式输出:
@prompt('写一个 {topic} 的故事')
def write_story(topic: str) -> str: ...
for chunk in write_story.stream("星际旅行"):
print(chunk, end='', flush=True)
Magentic 允许将任意 Python 函数注册为 LLM 的工具,实现复杂的多步骤推理。LLM 可以在对话过程中自主决定调用哪些工具函数,并将结果反馈回对话上下文。
Magentic 还支持将多个 LLM 调用串联成管道,前一步的输出自动作为后一步的输入,实现复杂的多步推理流程,例如:提取信息 -> 分类 -> 生成回复的流水线。
Magentic 深度集成了 OpenTelemetry,可与 Pydantic Logfire 无缝配合,为每个 LLM 调用生成完整的追踪记录,包括:token 消耗、latency、函数参数、AI 回复内容。这对于生产环境的成本控制和调试至关重要。测试覆盖率通过 pytest-cov 持续追踪,所有测试用例使用 VCR 录制回放机制避免真实 API 调用。
适合的场景:
不太适合的场景:
学习曲线:对于熟悉 Python 装饰器和 Pydantic 的开发者来说,Magentic 的学习成本极低——核心 API 只有两个装饰器,文档清晰,示例丰富。如果你是 Python 新手,理解装饰器语法可能需要一点时间。
Magentic 最大的局限在于它是一个工具库而非完整应用框架。如果你需要内置的向量存储、记忆管理、复杂的 agent 循环控制,仍然需要配合 LangChain 或其他框架使用。此外,作为一个相对小众的项目(2411 stars),社区规模和第三方集成生态远不如 LangChain 丰富,生产环境遇到问题时可依赖的资源相对有限。
Magentic 代表了 LLM 应用开发工具的一个演进方向——从 AI-first 框架向 Python-first 框架的回归。随着 LLMs 逐渐从实验性技术变成基础设施组件,开发者越来越期望用熟悉的编程工具来使用它们,而不是学习一套全新的 AI 框架语法。这种最小化侵入的理念,预计会在未来催生更多类似定位的工具库。