Magentic:为 Python 开发者打造无缝的 LLM 集成体验

June 04, 2025

Magentic

项目介绍

Magentic 是一个 Python 库,旨在将大型语言模型(LLM)无缝集成到 Python 代码中。它允许开发者使用 @prompt@chatprompt 装饰器创建函数,从而让 LLM 返回结构化输出。该库还支持将 LLM 查询和工具调用与传统 Python 代码相结合,以构建复杂的智能代理系统。

使用说明

  1. 安装:
    pip install magentic
    # 或使用 uv 安装
    uv add magentic
    
  2. 配置: 设置 OPENAI_API_KEY 环境变量来配置您的 OpenAI API 密钥。有关配置其他 LLM 提供商的详细信息,请参阅文档。
  3. @prompt 的基本用法:
    from magentic import prompt
    
    @prompt('给这段话加点“dude”味儿:{phrase}')
    def dudeify(phrase: str) -> str: ...
    
    dudeify("你好,最近怎么样?")
    # 返回: "嘿,dude!啥事儿?最近怎么样啊,我的老兄?"
    
  4. @prompt 的结构化输出:
    from magentic import prompt
    from pydantic import BaseModel
    
    class Superhero(BaseModel):
        name: str
        age: int
        power: str
        enemies: list[str]
    
    @prompt("创建一个名为 {name} 的超级英雄。")
    def create_superhero(name: str) -> Superhero: ...
    
    create_superhero("花园侠")
    # 返回: Superhero(name='花园侠', age=30, power='控制植物', enemies=['污染人', '水泥女侠'])
    
  5. @chatprompt 的聊天式提示:
    from magentic import chatprompt, AssistantMessage, SystemMessage, UserMessage
    from pydantic import BaseModel
    
    class Quote(BaseModel):
        quote: str
        character: str
    
    @chatprompt(
        SystemMessage("你是个电影迷。"),
        UserMessage("《哈利·波特》你最喜欢哪句台词?"),
        AssistantMessage(
            Quote(
                quote="沉溺于梦想而忘记生活,这可要不得。",
                character="阿不思·邓布利多",
            )
        ),
        UserMessage("你最喜欢《{movie}》哪句台词?"),
    )
    def get_movie_quote(movie: str) -> Quote: ...
    
    get_movie_quote("钢铁侠")
    # 返回: Quote(quote='我是钢铁侠。', character='托尼·斯塔克')
    
  6. FunctionCall 的函数调用:
    from typing import Literal
    from magentic import prompt, FunctionCall
    
    def search_twitter(query: str, category: Literal["latest", "people"]) -> str:
        """在 Twitter 上搜索查询内容。"""
        print(f"正在 Twitter 上搜索类别为 {category!r}{query!r}")
        return "<Twitter 搜索结果>"
    
    @prompt(
        "使用适当的搜索功能来回答:{question}",
        functions=[search_twitter],
    )
    def perform_search(question: str) -> FunctionCall[str]: ...
    
    output = perform_search("关于 LLM 的最新消息是什么?")
    # output: FunctionCall(search_twitter, 'LLMs', 'latest')
    output()
    # 打印: 正在 Twitter 上搜索类别为 'latest' 的 'LLMs'
    # 返回: '<Twitter 搜索结果>'
    
  7. @prompt_chain 的提示链:
    from magentic import prompt_chain
    
    def get_current_weather(location, unit="fahrenheit"):
        """获取给定地点的当前天气"""
        return {"temperature": "72", "forecast": ["sunny", "windy"]}
    
    @prompt_chain(
        "{city} 的天气怎么样?",
        functions=[get_current_weather],
    )
    def describe_weather(city: str) -> str: ...
    
    describe_weather("波士顿")
    # 返回: '波士顿目前的天气是 72°F,晴朗有风。'
    

主要特性

  • 结构化输出: 支持 Pydantic 模型和内置 Python 类型,以实现结构化输出。
  • 流式处理: 在生成过程中支持结构化输出和函数调用的流式传输。
  • LLM 辅助重试: 提升 LLM 对复杂输出模式的遵循度。
  • 可观测性: 集成 OpenTelemetry 进行日志记录和追踪,包括原生 Pydantic Logfire 集成。
  • 类型注解: 兼容 Lint 工具和 IDE。
  • 配置: 支持多种 LLM 提供商,包括 OpenAI、Anthropic 和 Ollama。
  • 聊天式提示: 支持多轮对话和少样本提示。
  • 并行函数调用: 支持并行调用多个函数。
  • 视觉能力: 提供 LLM 的图像和视觉处理能力。
  • 格式化: 用于控制输出格式的工具。
  • Asyncio 支持: 支持异步操作。
  • 函数链: 允许将 LLM 驱动的函数作为工具提供给其他 LLM 函数,实现复杂的智能代理流程。

目标用户

希望将大型语言模型集成到其 Python 应用程序中的开发者和工程师,特别是那些专注于: * 构建智能代理系统。 * 从 LLM 生成结构化数据。 * 利用 LLM 驱动的函数实现任务自动化。 * 通过自然语言输入利用 LLM 进行动态函数调用。

项目链接

应用场景

  • 数据提取与转换: 从非结构化文本中提取结构化信息(例如,姓名、地址、产品详情)。
  • 自动化内容生成: 生成动态内容,如产品描述、摘要或具有特定格式的创意写作。
  • 智能代理与聊天机器人: 开发能够理解用户意图、调用外部工具(API、数据库)并返回结构化响应的对话式代理。
  • 工作流自动化: 创建自动化的工作流,其中 LLM 通过调用预定义的 Python 函数来做出决策或执行操作。
  • 自然语言界面: 构建用户可以使用自然语言与复杂系统交互的界面,Magentic 将这些输入转换为函数调用。
  • 代码生成辅助: 潜在地用于根据提示生成代码片段或函数定义,充分利用其结构化输出能力。

分享本文