SuperAPI AI 工具集

magentic

Magentic 是一个用于将大型语言模型(LLM)无缝集成到 Python 代码中的开源库。它通过 @prompt、@chatprompt 和 @prompt_chain 等装饰器,让开发者能够像定义普通 Python 函数一样定义 LLM 提示模板,函数调用时参数会自动填入模板并发送给 LLM,最终返回结构化输出(支持 pydantic 模型和内置 Python 类型)。它支持流式输出、函数调用、并行函数调用、视觉输入、异步查询等功能,并内置 LLM 辅助重试机制以提高对复杂输出模式的遵循度。Magentic 可与 OpenAI、Anthropic、Ollama、LiteLLM、Mistral 等多种后端配合使用,并提供 OpenTelemetry 可观测性及 Pydantic Logfire 原生集成。类型注解友好,兼容 linter 和 IDE,适合构建复杂的智能体系统,也可用于简单的结构化生成任务。

访问官网

工具介绍

Magentic 是一个开源 Python 库,旨在将大型语言模型(LLM)无缝集成到 Python 代码中。通过使用 @prompt 和 @chatprompt 装饰器,开发者可以创建返回 LLM 结构化输出的函数,并将 LLM 查询、工具使用与传统 Python 代码结合,构建复杂的智能体系统。

主要能力:

  • 结构化输出:支持 pydantic 模型和内置 Python 类型。
  • 流式传输:可流式处理结构化输出和函数调用,在生成过程中即可使用。
  • LLM 辅助重试:提高 LLM 对复杂输出模式的遵循度。
  • 可观测性:支持 OpenTelemetry,并原生集成 Pydantic Logfire。
  • 类型注解:与 linter 和 IDE 良好兼容。
  • 多 LLM 提供商配置:包括 OpenAI、Anthropic、Ollama 等。
  • 其他特性:聊天提示、并行函数调用、视觉、格式化、Asyncio 等。

使用方式:

  1. 设置 OPENAI_API_KEY 环境变量以配置 OpenAI API 密钥;如需其他 LLM 提供商,参考配置说明。
  2. 使用 @prompt 装饰器定义 LLM 提示模板作为 Python 函数。函数调用时,参数插入模板,提示发送给 LLM,生成函数输出。装饰器会遵循函数的返回类型注解(支持 pydantic 支持的任意类型)。
  3. @chatprompt 装饰器类似 @prompt,但允许传入聊天消息作为模板(如系统消息或少样本提示),花括号 {example} 表示的格式字段会在所有消息中填充(FunctionResultMessage 除外)。
  4. LLM 可决定调用函数。此时 @prompt 装饰的函数返回 FunctionCall 对象,可调用该对象执行函数,使用 LLM 提供的参数。
  5. 当 LLM 需要调用一个或多个函数来生成最终答案时,@prompt_chain 装饰器自动解析 FunctionCall 对象,并将输出传回 LLM,直到获得最终答案。
  6. 使用 @prompt、@chatprompt 和 @prompt_chain 创建的 LLM 驱动函数可以作为参数传递给其他 @prompt / @prompt_chain 装饰器,如同普通 Python 函数,从而构建更复杂的 LLM 驱动功能。
  7. 使用 StreamedStr(或 AsyncStreamedStr)类流式传输 LLM 输出,可在生成文本时进行处理,也可同时创建多个 StreamedStr 并发流式获取 LLM 输出。
  8. 使用返回类型注解 Iterable(或 AsyncIterable)流式传输结构化输出,每个项目在下一个生成时即可处理。
  9. 使用异步函数/协程并发查询 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 可按以下优先级配置:

  1. 作为 model 参数传给 magentic 装饰器的 ChatModel 实例。
  2. 使用 with MyChatModel: 创建的当前聊天模型上下文。
  3. 由环境变量和 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 装饰器时,类型检查器可能报错,需按上述方法处理。