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的设计有两个主要目标:
- 简单但强大:它有足够的功能来发挥作用,但不会过于复杂以至于难以学习。
- 灵活:它可以立即使用,但你可以根据需要进行调整。
以下是其突出特点:
- 代理循环:自动管理代理如何思考、使用工具以及完成任务。
- 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
- 目的: 编排多代理系统。
- 步骤:
- 抓取新闻: 运行新闻代理,提示类似于“获取关于AI的新闻2023–10”。代理使用get_news_articles抓取原始新闻。
- 编辑新闻: 将原始新闻传递给编辑代理,后者将其重写为结构化格式。
- 输出: 打印并返回最终编辑的文章。
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
汇智网翻译整理,转载请标明出处
