OpenAI Agents SDK集成Ollama

本文介绍如何将OpenAI Agents SDK与Ollama搭配使用开发多代理系统。

OpenAI Agents SDK集成Ollama

本文介绍如何将OpenAI Agents SDK与Ollama搭配使用开发多代理系统。

1、Ollama简介

Ollama让你能够获取开源模型以供本地使用。它会自动从最佳来源拉取模型,并且如果你的计算机有专用GPU,它会无缝使用GPU加速而无需手动配置。通过修改提示可以轻松自定义模型,并且Langchain不是必需的。此外,Ollama还可以作为docker镜像访问,允许你将个性化模型部署为docker容器。

要运行此代码,你需要先设置你的环境。以下是所需内容:

  • Ollama安装
  • https://ollama.com下载并安装Ollama。Ollama是一个工具,允许你运行大型语言模型(LLMs)。
  • 安装完成后,通过在终端中运行以下命令拉取llama3.2模型:
ollama pull llama3.2
  • 这将在本地设置一个llama3.2模型服务器,代码将使用该服务器。

OpenAI发布了一个新的“开源”代理框架称为Agents SDK。这个构建良好的库被定位为OpenAI实验性Swarm多代理框架的生产级升级。实际上,Agents SDK最类似于Pydantic AI、LangChain或Llama-Index等框架,提供了一种结构化的方式来构建AI代理应用程序。

2、OpenAI Agents SDK简介

OpenAI Agents SDK是一个基于Python的包,让你能够以最少的努力创建AI应用程序。它是对OpenAI早期“Swarm”项目的升级,现在已具备生产就绪功能并且专注于简洁性。只需几个构建块(称为原语),你就可以构建复杂的AI工作流。这些原语是:

  • 代理:智能的AI单元,能够思考和行动。
  • 交接:一种让代理之间传递任务的方式。
  • 护栏:确保一切按计划进行的安全检查。

结合Python,这些功能让你能够创建复杂的AI系统,而无需学习太多新概念。此外,SDK还包括跟踪功能,帮助你查看应用程序内部发生的情况,从而更容易调试和改进。

SDK的设计有两个主要目标:

  1. 简单但强大:它有足够的功能来发挥作用,但不会过于复杂以至于难以学习。
  2. 灵活:它可以立即使用,但你可以根据需要进行调整。

以下是其突出特点:

  • 代理循环:自动管理代理如何思考、使用工具以及完成任务。
  • Python优先:利用Python的自然特性(如函数和循环),而不是强迫你进入新的框架。
  • 交接:让代理将任务委托给专家。
  • 护栏:检查输入或输出以尽早发现问题。
  • 函数工具:将任何Python函数转换为代理可以使用的工具。
  • 跟踪:显示你的代理正在执行的逐步视图。

Python包安装

pip install -U openai-agents duckduckgo-search
  • openai-agents: 提供创建AI代理的框架。
  • duckduckgo-search: 用于使用DuckDuckGo API进行搜索的库。
  • 假设:代码假设Ollama在本地运行于http://localhost:11434/v1,这是其API的默认端点。

3、单代理示例

代码中包含了一个注释掉的部分,展示了如何创建一个简单的单代理系统。虽然它没有在主脚本中执行,但它值得理解为一个基本示例:

from agents import Agent, Runner, OpenAIChatCompletionsModel, AsyncOpenAI  
  
# 配置模型  
model = OpenAIChatCompletionsModel(   
    model="llama3.2",  
    openai_client=AsyncOpenAI(base_url="http://localhost:11434/v1")  
)  
  
# 创建代理  
agent = Agent(  
    name="Assistant",  
    instructions="You are a helpful assistant",  
    model=model  
)  
  
# 同步运行代理  
result = Runner.run_sync(agent, "Create a meal plan for a week.")  
print(result.final_output)
  • 它做了什么:
  • 模型配置: 创建了一个OpenAIChatCompletionsModel实例,使用llama3.2模型,并通过AsyncOpenAI连接到本地Ollama服务器。
  • 代理创建: 定义了一个名为“Assistant”的代理,指示其成为有用的助手。
  • 任务执行: 使用Runner.run_sync请求代理创建一周的餐计划,然后打印结果。
  • 为什么注释掉: 这只是一个单代理的演示。脚本的主要重点是下面的多代理系统。

4、多代理系统

代码的主要部分构建了一个多代理系统,用于抓取新闻文章并将其编辑成可发布的格式。以下是完整的分解:

4.1 导入和模型配置

from duckduckgo_search import DDGS  
from agents import Agent, Runner, AsyncOpenAI, OpenAIChatCompletionsModel, function_tool  
from datetime import datetime  
  
# 获取当前日期的YYYY-MM格式  
current_date = datetime.now().strftime("%Y-%m")  
  
# 配置模型  
model = OpenAIChatCompletionsModel(  
    model="llama3.2",  
    openai_client=AsyncOpenAI(base_url="http://localhost:11434/v1")  
)

导入:

  • duckduckgo_search.DDGS: 用于网络搜索。
  • agents模块: 用于创建和运行代理。
  • datetime: 获取当前日期。
  • 当前日期: 将当前日期格式化为YYYY-MM(例如,“2023–10”),以便限制新闻搜索到当前月份。
  • 模型: 和单代理示例相同——使用llama3.2并通过本地Ollama服务器配置。

4.2 自定义工具: get_news_articles

@function_tool  
def get_news_articles(topic):  
    print(f"Running DuckDuckGo news search for {topic}...")  
      
    # DuckDuckGo搜索  
    ddg_api = DDGS()  
    results = ddg_api.text(f"{topic} {current_date}", max_results=5)  
    if results:  
        news_results = "\n\n".join([f"Title: {result['title']}\nURL: {result['href']}\nDescription: {result['body']}" for result in results])  
        print(news_results)  
        return news_results  
    else:  
        return f"Could not find news results for {topic}."
  • 用途: 这是一个自定义工具(用@function_tool装饰),用于从DuckDuckGo抓取新闻文章。
  • 如何工作:
  • 接受主题作为输入(例如,“AI”)。
  • 使用DDGS().text()搜索与主题和当前日期匹配的文章,限制为5个结果。
  • 格式化结果为字符串,每个文章包含标题、URL和描述,用双换行符分隔。
  • 返回格式化的字符串或找不到结果时返回错误消息。

4.3 新闻代理

news_agent = Agent(  
    name="News Assistant",  
    instructions="You provide the latest news articles for a given topic using DuckDuckGo search.",  
    tools=[get_news_articles],  
    model=model  
)
  • 角色: 抓取原始新闻文章。
  • 细节:
  • 名为“新闻助理”。
  • 指令是使用DuckDuckGo搜索通过get_news_articles工具提供最新新闻文章。
  • 使用llama3.2模型,并具有访问自定义工具的权限。

4.4 编辑代理

editor_agent = Agent(  
    name="Editor Assistant",  
    instructions="Rewrite and give me as news article ready for publishing. Each News story in separate section.",  
    model=model  
)
  • 角色: 将原始新闻精炼成可发布的格式。
  • 细节:
  • 名为“编辑助理”。
  • 指令是重写新闻文章,将每个故事组织成独立的部分。
  • 使用相同的llama3.2模型,但没有工具——它依赖于其语言技能。

4.5 工作流: run_news_workflow

def run_news_workflow(topic):  
    print("Running news Agent workflow...")  
      
    # 第一步: 抓取新闻  
    news_response = Runner.run_sync(  
        news_agent,  
        f"Get me the news about {topic} on {current_date}"  
    )  
      
    # 访问RunResult对象中的内容  
    raw_news = news_response.final_output  
      
    # 第二步: 将新闻传递给编辑器进行最终审查  
    edited_news_response = Runner.run_sync(  
        editor_agent,  
        raw_news  
    )  
      
    # 访问RunResult对象中的内容  
    edited_news = edited_news_response.final_output  
      
    print("Final news article:")  
    print(edited_news)  
      
    return edited_news
  • 目的: 编排多代理系统。
  • 步骤:
  1. 抓取新闻: 运行新闻代理,提示类似于“获取关于AI的新闻2023–10”。代理使用get_news_articles抓取原始新闻。
  2. 编辑新闻: 将原始新闻传递给编辑代理,后者将其重写为结构化格式。
  3. 输出: 打印并返回最终编辑的文章。

4.6 执行

print(run_news_workflow("AI"))
  • 使用主题“AI”运行工作流,抓取并编辑关于人工智能的新闻。

5、它们是如何一起工作的

开始: 你调用run_news_workflow("AI")。

新闻代理:

  • 接收到提示“获取关于AI的新闻2023–[当前日期]”。
  • 使用 get_news_articles 函数在 DuckDuckGo 上搜索“AI 2023–10”(假设是2023年10月)。
  • 返回原始新闻文章的字符串。

编辑代理

  • 接收原始新闻字符串。
  • 将其重写为可发布的格式,每个故事单独成段。

结果:最终的文章被打印并返回。

这展示了一个多代理系统,其中:

  • 新闻代理专注于数据检索。
  • 编辑代理侧重于内容优化。
  • 工作流将它们的努力结合在一起。

6、示例内容输出

由于我无法实时运行代码(这里没有访问 DuckDuckGo 或 Ollama),我将基于代码的意图模拟可能的输出。假设是在2023年10月,主题是“人工智能”:

原始新闻(来自新闻代理):

标题:医疗领域的 AI 突破宣布  
网址:https://example.com/ai-healthcare  
描述:研究人员表示,一种新的 AI 模型可以预测疾病,准确率达到95%。  

标题:硅谷举办 AI 伦理会议  
网址:https://example.com/ai-ethics  
描述:专家们聚集在一起讨论 AI 进展带来的伦理影响。  

标题:科技巨头发布新一代 AI 芯片  
网址:https://example.com/ai-chip  
描述:该芯片承诺将消费设备的 AI 处理速度提高一倍。

编辑后的新闻(来自编辑代理):

### 2023年10月人工智能最新资讯  

#### 医疗领域的人工智能技术突破  
研究人员公布了一种具有突破性的人工智能模型,能够以令人印象深刻的95%的准确性预测疾病。这一创新可能会彻底改变早期诊断和治疗,有可能挽救无数生命。欲了解更多信息,请访问 [https://example.com/ai-healthcare](https://example.com/ai-healthcare)。  

#### 人工智能伦理在硅谷占据中心地位  
本月,硅谷举办了一场关于人工智能伦理的重大会议,汇集了专家们来应对快速发展的 AI 技术所带来的道德挑战。讨论重点集中在隐私、偏见和问责制上。了解更多请访问 [https://example.com/ai-ethics](https://example.com/ai-ethics)。  

#### 科技巨头推出下一代 AI 芯片  
一家领先的科技公司发布了一款新型 AI 芯片,旨在将消费设备的 AI 处理速度提高一倍。这一发展有望提升从智能手机到智能家居等 AI 驱动的应用程序。查看完整报道请访问 [https://example.com/ai-chip](https://example.com/ai-chip)。

注意:实际内容将取决于实时的 DuckDuckGo 结果和 llama3.2 模型的编辑能力,但此示例显示了预期的结构。

7、结束语

这个脚本展示了 AI 代理的强大用途:

  • 模块化:不同的代理处理不同的任务(获取 vs. 编辑)。
  • 工具集成:自定义工具如 get_news_articles 扩展了代理的功能。
  • 工作流:链接代理创建了一个复杂的管道。

原文链接:OpenAI Agents SDK with Ollama

汇智网翻译整理,转载请标明出处