Type something to search...
OpenAIs Swarm(第二部分):使用 Ollama 和 Pydantic 的直接、本地优先方法

OpenAIs Swarm(第二部分):使用 Ollama 和 Pydantic 的直接、本地优先方法

一个简短的代码参考以供构建。

TLDR:

结合Ollama和Swarm框架,呈现了一种以本地为优先的构建智能AI代理的方法。

Ollama可以在本地运行大型语言模型,确保隐私和控制,而Swarm则提供了一个结构化的环境,用于设计和管理AI代理。

我们以第一性原理的编程方法强调简单性和高效性,避免使用带来不必要抽象的复杂框架,从而增加使用的tokens数量,并延迟首次token的生成时间。

今天,我们将深入探讨一个实际的实现,不仅突出如何创建支持pydantic的代理,还展示了Agentic函数调用和结构化编程的强大功能。

理解堆栈

Ollama 集成

该实现利用了 Ollama,这是一个用于本地运行大型语言模型的开源框架。这个设置特别有趣之处在于它是如何通过与 OpenAI 兼容的 API 接口进行集成的:

client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")

此配置允许开发者在通过 Ollama 本地运行模型时,使用熟悉的 OpenAI 风格的交互。我们的示例使用了 Qwen 2.5 Coder 模型(32B 参数),这是一个非常强大的模型。

Swarm框架

Swarm提供了创建和管理AI代理的基础结构。它旨在促进:

  • 结构化的代理定义
  • 函数调用能力
  • 消息处理和响应处理
  • 上下文管理

深入探讨:构建信息提取代理

该实现展示了一个实际用例:一个旨在从非结构化文本中提取关于人员的结构化信息的代理。

例如,以下文本:

"Pat Lesieur is a 65-year-old software developer skilled 
in AI Agents and RAG workflows."

以及以下的 pydantic 类:

## 定义我们的 Pydantic 类以配合结构化输出模型
class PersonInfo(BaseModel):
    name: str
    age: int
    skills: List[str]
    bio: Optional[str] = None

该代理具有以下提示:

instructions="""You are a precise information 
extraction agent that converts unstructured 
text about people into a specific JSON format.
IMPORTANT: When calling process_extracted_data, you MUST format the data exactly as follows:
{
    "name": "string",
    "age": number,
    "skills": ["skill1", "skill2"],  # MUST be a JSON array/list of strings
    "bio": "string"
}
The skills parameter MUST ALWAYS be a JSON array/list of strings, NOT a comma-separated string.
CORRECT format for skills:
  "skills": ["AI Agents", "RAG workflows"]
INCORRECT format for skills:
  "skills": "AI Agents, RAG workflows"
Example input: "John Smith is a 35-year-old software developer skilled in Python and Cloud Architecture."
You should call process_extracted_data with:
{
    "name": "John Smith",
    "age": 35,
    "skills": ["Python", "Cloud Architecture"],
    "bio": "Software developer"
}"""

以产生:

=== process_extracted_data called ===
Received data:
name: Pat Lesieur
age: 65
skills: ['AI Agents', 'RAG workflows']
bio: Software developer
Successfully created PersonInfo: name='Pat Lesieur' age=65 skills=['AI Agents', 'RAG workflows'] bio='Software developer'
=== process_extracted_data finished ===

=== Complete Response Details ===
Message type: assistant
Content: 
Tool calls: [
  {
    "id": "call_62rrvh2u",
    "function": {
      "arguments": "{\"age\":65,\"bio\":\"Software developer\",\"name\":\"Pat Lesieur\",\"skills\":[\"AI Agents\",\"RAG workflows\"]}",
      "name": "process_extracted_data"
    },
    "type": "function",
    "index": 0
  }
]
Message type: tool
Content: name='Pat Lesieur' age=65 skills=['AI Agents', 'RAG workflows'] bio='Software developer'

代理架构

实现的核心围绕着一个使用 Pydantic 定义的 PersonInfo 模型:

class PersonInfo(BaseModel):
    name: str
    age: int
    skills: List[str]
    bio: Optional[str] = None

这种结构化的方法确保了类型安全和数据验证,使得代理的输出可靠且一致。

代理配置

代理配置了特定的指令和能力:

def create_person_info_agent() -> Agent:
    return Agent(
        name="PersonInfoAgent",
        instructions="""...""",
        functions=[process_extracted_data]
    )

主要特点包括:

  1. 清晰的指令设置
  2. 数据处理的功能注册
  3. 结构化的输出格式

强大的数据处理

该实现包括复杂的数据清理和处理:

def clean_json_string(data_str: str) -> str:
    # Handles markdown code blocks and formatting
    if "```" in data_str:
        match = re.search(r'```(?:json)?\n(.*?)\n```', data_str, re.DOTALL)
        if match:
            data_str = match.group(1)
    return data_str.strip()

运行代理

该系统通过 Swarm 客户端将一切结合在一起:

swarm_client = Swarm(client=client)
response = swarm_client.run(
    agent=agent,
    model_override=model,
    messages=[{
        "role": "user",
        "content": input_text
    }],
    execute_tools=True
)

主要优点

  1. 本地模型执行:通过使用 Ollama,您可以控制自己的数据并在本地运行模型。
  2. 结构化输出:Pydantic 集成确保类型安全和经过验证的输出。
  3. 灵活架构:修改代理的指令和数据模型可以轻松适应不同的用例。
  4. 开发者友好:与 OpenAI 兼容的接口使得熟悉 OpenAI API 的开发者易于适应。

实际应用

该实现特别适用于:

  • 从非结构化文本中提取信息
  • 自动化数据处理管道
  • 构建对话 AI 代理
  • 从自然语言输入创建结构化数据

结论

结合 Ollama 和 Swarm 展示了一种构建 AI 代理的强大方法。通过利用 Ollama 的本地模型执行和 Swarm 提供的结构化代理框架,开发者可以创建复杂的 AI 应用程序,既能保持数据隐私,又能提供可靠的结构化输出。

该实现展示了现代 AI 开发如何强大且实用,结合了本地模型执行与结构化编程实践的最佳之处。

Related Posts

结合chatgpt-o3-mini与perplexity Deep Research的3步提示:提升论文写作质量的终极指南

结合chatgpt-o3-mini与perplexity Deep Research的3步提示:提升论文写作质量的终极指南

AI 研究报告和论文写作 合并两个系统指令以获得两个模型的最佳效果 Perplexity AI 的 Deep Research 工具提供专家级的研究报告,而 OpenAI 的 ChatGPT-o3-mini-high 擅长推理。我发现你可以将它们结合起来生成令人难以置信的论文,这些论文比任何一个模型单独撰写的都要好。你只需要将这个一次性提示复制到 **

阅读更多
让 Excel 过时的 10 种 Ai 工具:实现数据分析自动化,节省手工作业时间

让 Excel 过时的 10 种 Ai 工具:实现数据分析自动化,节省手工作业时间

Non members click here作为一名软件开发人员,多年来的一个发现总是让我感到惊讶,那就是人们还在 Excel

阅读更多
使用 ChatGPT 搜索网络功能的 10 种创意方法

使用 ChatGPT 搜索网络功能的 10 种创意方法

例如,提示和输出 你知道可以使用 ChatGPT 的“搜索网络”功能来完成许多任务,而不仅仅是基本的网络搜索吗? 对于那些不知道的人,ChatGPT 新的“搜索网络”功能提供实时信息。 截至撰写此帖时,该功能仅对使用 ChatGPT 4o 和 4o-mini 的付费会员开放。 ![](https://images.weserv.nl/?url=https://cdn-im

阅读更多
掌握Ai代理:解密Google革命性白皮书的10个关键问题解答

掌握Ai代理:解密Google革命性白皮书的10个关键问题解答

10 个常见问题解答 本文是我推出的一个名为“10 个常见问题解答”的新系列的一部分。在本系列中,我旨在通过回答关于该主题的十个最常见问题来分解复杂的概念。我的目标是使用简单的语言和相关的类比,使这些想法易于理解。 图片来自 [Solen Feyissa](https://unsplash.com/@solenfeyissa?utm_source=medium&utm_medi

阅读更多
在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和科技这样一个动态的行业中,保持领先意味着不断提升你的技能。无论你是希望深入了解人工智能模型性能、掌握数据分析,还是希望通过人工智能转变传统领域如法律,这些课程都是你成功的捷径。以下是一个精心策划的高价值课程列表,可以助力你的职业发展,并让你始终处于创新的前沿。 1. 生成性人工智能简介课程: [生成性人工智能简介](https://genai.works

阅读更多
揭开真相!深度探悉DeepSeek AI的十大误区,您被误导了吗?

揭开真相!深度探悉DeepSeek AI的十大误区,您被误导了吗?

在AI军备竞赛中分辨事实与虚构 DeepSeek AI真的是它所宣传的游戏规则改变者,还是仅仅聪明的营销和战略炒作?👀 虽然一些人将其视为AI效率的革命性飞跃,但另一些人则认为它的成功建立在借用(甚至窃取的)创新和可疑的做法之上。传言称,DeepSeek的首席执行官在疫情期间像囤积卫生纸一样囤积Nvidia芯片——这只是冰山一角。 从其声称的550万美元培训预算到使用Open

阅读更多
Type something to search...