Magentic 是一个开源 Python 库,旨在将大型语言模型(LLM)无缝集成到 Python 代码中。通过使用 @prompt 和 @chatprompt 装饰器,开发者可以创建返回 LLM 结构化输出的函数,并将 LLM 查询、工具使用与传统 Python 代码结合,构建复杂的智能体系统。
主要能力:
- 结构化输出:支持 pydantic 模型和内置 Python 类型。
- 流式传输:可流式处理结构化输出和函数调用,在生成过程中即可使用。
- LLM 辅助重试:提高 LLM 对复杂输出模式的遵循度。
- 可观测性:支持 OpenTelemetry,并原生集成 Pydantic Logfire。
- 类型注解:与 linter 和 IDE 良好兼容。
- 多 LLM 提供商配置:包括 OpenAI、Anthropic、Ollama 等。
- 其他特性:聊天提示、并行函数调用、视觉、格式化、Asyncio 等。
使用方式:
- 设置 OPENAI_API_KEY 环境变量以配置 OpenAI API 密钥;如需其他 LLM 提供商,参考配置说明。
- 使用 @prompt 装饰器定义 LLM 提示模板作为 Python 函数。函数调用时,参数插入模板,提示发送给 LLM,生成函数输出。装饰器会遵循函数的返回类型注解(支持 pydantic 支持的任意类型)。
- @chatprompt 装饰器类似 @prompt,但允许传入聊天消息作为模板(如系统消息或少样本提示),花括号 {example} 表示的格式字段会在所有消息中填充(FunctionResultMessage 除外)。
- LLM 可决定调用函数。此时 @prompt 装饰的函数返回 FunctionCall 对象,可调用该对象执行函数,使用 LLM 提供的参数。
- 当 LLM 需要调用一个或多个函数来生成最终答案时,@prompt_chain 装饰器自动解析 FunctionCall 对象,并将输出传回 LLM,直到获得最终答案。
- 使用 @prompt、@chatprompt 和 @prompt_chain 创建的 LLM 驱动函数可以作为参数传递给其他 @prompt / @prompt_chain 装饰器,如同普通 Python 函数,从而构建更复杂的 LLM 驱动功能。
- 使用 StreamedStr(或 AsyncStreamedStr)类流式传输 LLM 输出,可在生成文本时进行处理,也可同时创建多个 StreamedStr 并发流式获取 LLM 输出。
- 使用返回类型注解 Iterable(或 AsyncIterable)流式传输结构化输出,每个项目在下一个生成时即可处理。
- 使用异步函数/协程并发查询 LLM,可显著提高生成速度,并允许其他异步代码在等待 LLM 输出时运行。
附加功能:
- @prompt 的 functions 参数可包含异步/协程函数,调用对应 FunctionCall 对象时需 await 结果。
- 使用 Annotated 类型注解为函数参数提供描述和其他元数据(参考 pydantic 文档)。
- @prompt 和 @prompt_chain 装饰器接受 model 参数,可传入 OpenaiChatModel 实例以使用 GPT4 或配置不同的 temperature。
- 可注册其他类型作为 @prompt 函数的返回类型注解(参考 Pandas DataFrame 示例笔记本)。
后端/LLM 配置: Magentic 支持多个 LLM 提供商(后端),指用于与 LLM API 交互的 Python 包。支持的后端:
- OpenAI(默认后端):使用 openai Python 包,支持所有功能,无需额外安装,直接导入 OpenaiChatModel 类。
- Ollama:支持 OpenAI 兼容 API,可通过 OpenAI 后端使用 Ollama 模型。先从 ollama.com 安装 ollama,拉取模型,然后在创建 OpenaiChatModel 实例时指定模型名称和 base_url。
- 使用 openai 后端时,设置 MAGENTIC_OPENAI_BASE_URL 环境变量或使用 OpenaiChatModel(..., base_url="http://localhost:8080"),即可搭配任何 OpenAI 兼容 API(如 Azure OpenAI Service、LiteLLM OpenAI Proxy Server、LocalAI)。注意:若 API 不支持工具调用,则无法创建返回 Python 对象的提示函数,但其他功能仍可用。
- Azure:使用 openai 后端时,需设置 MAGENTIC_OPENAI_API_TYPE 环境变量为 "azure" 或使用 OpenaiChatModel(..., api_type="azure"),并设置 openai 包访问 Azure 所需的环境变量。
- Anthropic:使用 anthropic Python 包,支持所有功能。安装 magentic 包时加 anthropic extra,或直接安装 anthropic 包,然后导入 AnthropicChatModel 类。
- LiteLLM:使用 litellm Python 包,可查询多种提供商的 LLM。注意:某些模型可能不支持 magentic 的全部功能(如函数调用/结构化输出和流式传输)。安装 magentic 包时加 litellm extra,或直接安装 litellm 包,然后导入 LitellmChatModel 类。
- Mistral:使用 openai Python 包并做小幅修改以兼容 Mistral API,支持所有功能。但工具调用(包括结构化输出)不是流式传输,而是一次性接收。未来版本可能改用 mistral Python 包。无需额外安装,直接导入 MistralChatModel 类。
配置后端: 默认 ChatModel 可按以下优先级配置:
- 作为 model 参数传给 magentic 装饰器的 ChatModel 实例。
- 使用 with MyChatModel: 创建的当前聊天模型上下文。
- 由环境变量和 src/magentic/settings.py 中默认设置创建的全局 ChatModel。 可设置的环境变量见文档。
类型检查器处理: 由于 @prompt 装饰的函数没有函数体或返回值,许多类型检查器会发出警告或错误。处理方法:
- 全局禁用检查,例如在 mypy 中禁用 empty-body 错误代码:# pyproject.toml [tool.mypy] disable_error_code = ["empty-body"]
- 使函数体为 ...(不满足 mypy)或 raise。@prompt("Choose a color") def random_color() -> str: ...
- 在每个函数上使用注释 # type: ignore[empty-body],此时可添加文档字符串代替 ...。@prompt("Choose a color") def random_color() -> str: # type: ignore[empty-body] """Returns a random color."""
适用场景: Magentic 适用于需要将 LLM 集成到 Python 应用中的开发者,尤其是构建智能体系统、需要结构化输出、流式处理、函数调用或多 LLM 提供商支持的场景。 限制:
- 部分后端(如 LiteLLM 的某些模型、不支持工具调用的 OpenAI 兼容 API)可能不支持 magentic 的全部功能。
- Mistral 后端的工具调用(包括结构化输出)不支持流式传输。
- 使用 @prompt 装饰器时,类型检查器可能报错,需按上述方法处理。