AutoGen学习笔记系列(一)Tutorial - Model

这个系列文章记录了学习微软 AutoGen 的过程,与 smolagents 学习笔记系列一样,仍然以官方教程+自己的理解为主线,中间可能穿插几个番外支线的形式写博客。

【注意】:在阅读这篇文章之前需要确保已经按照其 Installation 小节完成必要的安装,这部分基本没什么内容,这里我以 conda 方式管理环境为例将浓缩一下步骤:

$ conda create -n autogen python=3.12
$ conda activate autogen
$ pip install -U "autogen-agentchat"
$ pip install "autogen-ext[openai]" "autogen-ext[azure]"

这篇文章瞄准的是官网教程 Tutorial 小节中的 Models部分,官网教程中的第一小节 Introduction 只有一页内容,主要是提供了几个跳转链接,下面是上述三个小节的链接,感兴趣的可以进入查看下,我在此处的第一篇就直接从 Models 开始:

  • Installation:https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/installation.html# ;
  • Introduction:https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/tutorial/index.html ;
  • Models:https://microsoft.github.io/autogen/stable/user-guide/agentchat-user-guide/tutorial/models.html# ;

在这里插入图片描述


OpenAI

【注意】:

  1. AutoGen与OpenAI的绑定比较强,教程中会出现大量的在线API调用,建议在某宝上买一点Token体验下,初学者用多5刀就足够体验完这个系列的教程内容了;
  2. 示例尽量不要用 openai.py, ollama.py, autogen.py 这种文件名,因为很容易让解释器从示例中找类进而引发循环载入,建议都用 demo.py 命名。如果你遇到了奇奇怪怪的报错,首先应该检查你的文件名是否正确;

官网提供的代码拼接起来是无法直接运行的,因为其将await字段没有包在async 函数中,这里需要对其进行修改:

from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_core.models import UserMessage
import asyncio, osos.environ["OPENAI_API_KEY"] = "你的API Key,通常以sk-开头"openai_model_client = OpenAIChatCompletionClient(model="gpt-4o-2024-08-06",# api_key="sk-...", # Optional if you have an OPENAI_API_KEY environment variable set.
)async def main():result = await openai_model_client.create([UserMessage(content="What is the capital of France?", source="user")])print(result)asyncio.run(main())

运行后结果如下:

$ python demo.pyfinish_reason='stop' content='The capital of France is Paris.' usage=RequestUsage(prompt_tokens=15, completion_tokens=8) cached=False logprobs=None thought=None

Azure OpenAI && Azure AI Foundry && Gemini

  • Azure OpenAI、Azure AI Foundry 这两个示例需要你在微软的 Azure 云上已经部署好一个 OpenAI 的模型,我后面会在番外篇记录如何部署,届时再回头对这部分示例代码进行详解。如果你已经在Azure上部署好了模型,可以自己尝试运行一下代码;
  • Gemini 是谷歌提供的一个模型,我申请到API Key后会在这里进行补充;

Ollama

接下来这个小节是重头戏,因为我先前的几片学习笔记和我平时的实验环境都使用的是Ollama本地模型或HuggingFace在线模型。

在运行示例代码之前你需要确认本地有哪些可用模型,后面引用的模型名 必须以命令输出的为准

$ ollama list
(LLM) ~/Desktop/AutoGen $ ollama list
NAME                        ID              SIZE      MODIFIED     
llama3:latest               365c0bd3c000    4.7 GB    2 weeks ago     

官网的示例同样不能直接运行,修改后如下:

from autogen_core.models import UserMessage
from autogen_ext.models.openai import OpenAIChatCompletionClient
import asynciomodel_client = OpenAIChatCompletionClient(model="llama3:latest",    # 填写你本地可用的模型名base_url="http://localhost:11434/v1",api_key="placeholder",model_info={"vision": False,"function_calling": True,"json_output": False,"family": "unknown",},
)async def main():response = await model_client.create([UserMessage(content="What is the capital of France?", source="user")])print(response)if __name__ == "__main__":asyncio.run(main())

运行输出如下:

$ python demo.pyfinish_reason='stop' content='The capital of France is Paris.' usage=RequestUsage(prompt_tokens=17, completion_tokens=8) cached=False logprobs=None thought=None

Semantic Kernel Adapter

这部分其实介绍的是如何使用AutoGen提供的 Semantic Kernel 适配器,这玩意简单来说就是把输入 prompt 经过多部拆解,并在必要时检索外部数据,转化为更好的 prompt 给模型。这个也是微软开源的一个项目,后面我也会出一个Semantic Kernel的学习笔记系列。

根据官网文档介绍,AutoGen 提供了多个 Semantic Kernel 适配器:

  • semantic-kernel-anthropic: Install this extra to use Anthropic models.
  • semantic-kernel-google: Install this extra to use Google Gemini models.
  • semantic-kernel-ollama: Install this extra to use Ollama models.
  • semantic-kernel-mistralai: Install this extra to use MistralAI models.
  • semantic-kernel-aws: Install this extra to use AWS models.
  • semantic-kernel-hugging-face: Install this extra to use Hugging Face models.

如果你想要安装哪个适配器则用下面的命令:

$ pip install "autogen-ext[适配器名]"

官网的demo中使用的是 Anthropic 公司的接口,这样的话又需要我们去申请API,所以我这里的示例就直接只用Ollama的适配器,这个是纯本地的模型就不涉及API问题,首先根据官网教程安装这个适配器:

pip install "autogen-ext[semantic-kernel-ollama]"

然后对官网代码进行改动:

import os, asynciofrom autogen_core.models import UserMessage
from autogen_ext.models.semantic_kernel import SKChatCompletionAdapter
from semantic_kernel import Kernel
# from semantic_kernel.connectors.ai.anthropic import AnthropicChatCompletion, AnthropicChatPromptExecutionSettings
from semantic_kernel.connectors.ai.ollama import OllamaChatCompletion, OllamaChatPromptExecutionSettings
from semantic_kernel.memory.null_memory import NullMemory# 创建Ollama客户端
sk_client = OllamaChatCompletion(ai_model_id="llama3:latest"
)
# 设置推理参数,这里只对温度进行了设置
settings = OllamaChatPromptExecutionSettings(temperature=0.2,
)# 适配Ollama客户端到适配器上
anthropic_model_client = SKChatCompletionAdapter(sk_client, kernel=Kernel(memory=NullMemory()), prompt_settings=settings
)# 发送一个模型到Ollama模型上
async def main():model_result = await anthropic_model_client.create(messages=[UserMessage(content="What is the capital of France?", source="User")])print(model_result)if __name__ == "__main__":asyncio.run(main())

运行结果如下:

$ python demo.py 
finish_reason='stop' content='The capital of France is Paris.' usage=RequestUsage(prompt_tokens=17, completion_tokens=8) cached=False logprobs=None thought=None

题外话

其实根据上面这么多个实例我们可以发现,对于同一个问题而言所有模型输出的结果基本一致:

  • OpenAI:
finish_reason='stop' content='The capital of France is Paris.' usage=RequestUsage(prompt_tokens=15, completion_tokens=8) cached=False logprobs=None thought=None
  • Ollama without SK adaptor:
finish_reason='stop' content='The capital of France is Paris.' usage=RequestUsage(prompt_tokens=17, completion_tokens=8) cached=False logprobs=None thought=None
  • Ollama with SK adaptor:
finish_reason='stop' content='The capital of France is Paris.' usage=RequestUsage(prompt_tokens=17, completion_tokens=8) cached=False logprobs=None thought=None

那么,我们就可以对Agent性能或者期望进行一次总结:

  1. 我们期望 Agent 每次都输出标准格式的内容,因为这样方便从中提取有效信息。
  2. 我们期望不同体量的 Agent 输出的结果基本一致,这样方便压缩成本;
  3. 我们期望对于同一个问题,Agent 的输出最好保持稳定,这样可以用来判定模型有效性;

如果你之前有阅读并实操过我关于 smolagents 库的笔记的话会发现模型每次输出的结果都存在变化,很难做到一次就得到最终答案,即便模型可能在第一次就给出了结论,但因为格式等原因会多次轮询模型。

这里其实就体现了 Agent 设计的优劣了,因为LLM最重要的是 prompt ,一个好的 Agent 会提供更严谨的提示词与恰当的参数来限制模型的内容,甚至规定好格式只允许模型这样输出,这样就可以拉低模型性能之间的差距,因为我们知道参数量越大的模型越容易遵守你的制定的规则,因为它能够读懂你的规则,所以让满血的模型数据规定格式内容是非常容易的,但对于量化模型而言就很困难了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28679.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探秘基带算法:从原理到5G时代的通信变革【八】QAM 调制 / 解调

文章目录 2.7 QAM 调制 / 解调2.7.1 概述2.7.2 星座图星座图的结构与性能发射端的信息编码与接收端的解码差分编码的分类与实现差分编码的模4格雷加法器公式16QAM星座图与映射关系 2.7.3 信号表达式正交振幅调制的基本原理与系统分析相位误差对QAM性能的影响多电平正交振幅调制…

本地YARN集群部署

请先完成HDFS的前置部署,部署方式可查看:本地部署HDFS集群https://blog.csdn.net/m0_73641796/article/details/145998092?spm1001.2014.3001.5502 部署说明 组件配置文件启动进程备注Hadoop HDFS需修改 需启动: NameNode作为主节点 DataNode作为从节点 Secondary…

vivado 充分利用 IP 核

充分利用 IP 核 使用预先验证的 IP 核能够大幅减少设计和验证工作量,从而加速产品上市进程。如需了解更多有利用 IP 的信息,请参 阅以下资源: • 《 Vivado Design Suite 用户指南:采用 IP 进行设计》 (UG896) [ 参照 1…

Python-07PDF转Word

2025-03-04-PDF转Word DeepSeek等大模型从来都不是简单的写一个静态博客这么肤浅(太多博主都只讲这个内容了)借助全网大神的奇思妙想,拓展我狭隘的思维边界。 文章目录 2025-03-04-PDF转Word [toc]1-参考网址2-学习要点3-核心逻辑4-核心代码 …

android11使用gpio口控制led状态灯

目录 一、简介 二、解决方法 A、底层驱动 B、上层调用 C、验证 一、简介 1、需求:这里是用2个gpio口来控制LED灯,开机时默认亮蓝灯,按开机键,休眠亮红灯,唤醒亮蓝灯。 原理图: 这里由于主板上电阻R63…

el-input 设置类型为number时,输入中文后光标会上移,并且会出现上下箭头

光标上移 设置 el-input 的 typenumber后,只能输入数字,输入中文后会自动清空,但是会出现一个问题:【光标会上移,如下图】 解决方法:修改样式 注意:需要使用样式穿透 :deep( ) /*解决el-in…

el-table一格两行;概率;find

样式&#xff1a; 根据概率表头关键代码&#xff1a;rateRanges&#xff1b; scope.row.targetHitTable.find((target:any) > target.targetHitRate > range.min && target.targetHitRate < range.max)!.targetHitNum &#xff08;1&#xff09;!.是TypeScri…

CSS定位详解上

1. 相对定位 1.1 如何设置相对定位&#xff1f; 给元素设置 position:relative 即可实现相对定位。 可以使用 left 、 right 、 top 、 bottom 四个属性调整位置。 1.2 相对定位的参考点在哪里&#xff1f; 相对自己原来的位置 1.3 相对定位的特点&#xff1…

二、Java-封装playwright UI自动化(根据官网执行步骤,首先封装BrowserFactory枚举类及BrowserManager)

前言 查看playwright官网&#xff0c;api文档了解到&#xff0c;playwright的基本步骤&#xff1a; 1、实例化一个playwright 2、启动一个浏览器类型 3、打开一个页面 所以&#xff0c;在封装时需要有一个浏览器工厂类&#xff0c;定义不同的浏览器类型&#xff0c;在配置文…

【问题解决】Jenkins使用File的exists()方法判断文件存在,一直提示不存在的问题

小剧场 最近为了给项目组提供一个能给Java程序替换前端、后端的增量的流水线&#xff0c;继续写上了声明式流水线。 替换增量是根据JSON配置文件去增量目录里去取再替换到对应位置的&#xff0c;替换前需要判断增量文件是否存在。 判断文件是否存在&#xff1f;作为一个老Ja…

神策数据严正声明

近日&#xff0c;我们发现有不法分子冒充神策网络科技&#xff08;北京&#xff09;有限公司&#xff08;以下简称”神策数据”&#xff09;的名义&#xff0c;发布虚假的招聘广告、面试邀请&#xff0c;企图误导求职者并进行不法行为。对此&#xff0c;我司发布严正声明&#…

ICLR 2025|香港浸会大学可信机器学习和推理课题组专场

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; AITIME 01 ICLR 2025预讲会团队专场 AITIME 02 专场信息 01 Noisy Test-Time Adaptation in Vision-Language Models 讲者&#xff1a;曹晨涛&#xff0c;HKBU TMLR Group一年级博士生&#xff0c;目前关注基础…

MySQL增量更新数据:高效同步策略与PanguSync实战指南

Mysql增量更新数据软件下载https://pan.baidu.com/s/1WesHaKGO7uQMhPNE-BTDmg?pwdabcd#list/path%2F 在数据驱动的商业环境中&#xff0c;实时数据同步已成为企业数字化转型的关键。本文将深入探讨MySQL增量更新的核心技术&#xff0c;并详细解析如何通过PanguSync工具实现高…

无人机灯光原理与应用解析!

工作原理 LED光源&#xff1a;LED因其高效、长寿命、高亮度和轻便等优点&#xff0c;成为无人机灯光的主要光源。 电路控制&#xff1a;通过微控制器或飞行控制器调节电流&#xff0c;控制灯光的开关、亮度和颜色。 信号传输&#xff1a;灯光控制信号通过无线或有线方式从遥…

51c自动驾驶~合集52

我自己的原文哦~ https://blog.51cto.com/whaosoft/13383340 #世界模型如何推演未来的千万种可能 驾驶世界模型&#xff08;DWM&#xff09;&#xff0c;专注于预测驾驶过程中的场景演变&#xff0c;已经成为追求自动驾驶的一种有前景的范式。这些方法使自动驾驶系统能够更…

lamp平台介绍

一、lamp介绍 网站&#xff1a; 静态 动态 php语言 .php 作用&#xff1a;运行php语言编写动态网站应用 lamp Linux Apache MySQL PHP PHP是作为httpd的一个功能模块存在的 二、部署lamp平台 1、测试httpd是否可正常返回PHP的响应 2、测试PHP代码是否可正常连接数据…

ROM修改进阶教程------修改安卓机型SELinux宽容的几种方式方法 以及第三方系统中如何关闭SELinux宽容

SELinux是一种强制访问控制安全机制,用于增强Linux系统的安全性。在某些情况下,可能需要对 SELinux 进行宽容设置,以满足特定的应用需求。当SELinux处于宽容模式时,系统允许违反安全策略的行为发生,但不会阻止这些行为,通常会在日志中记录这些违规事件。这与强制模式不同…

如何在 Aptos 上铸造 NFT

今天文章的第一部分将演示如何在 Aptos 上铸造 NFT&#xff0c;并使用 Moralis 轻松获取所有交易详细信息。在这里&#xff0c;我们将指导您完成使用 Aptos CLI 铸造活动门票 NFT 基本代币的过程。您还将了解如何完成初始设置步骤。此外&#xff0c;您还将了解如何获取 Moralis…

Springboot 梳理

一、Springboot 特性 方便创建可独立运行的spring应用程序直接内嵌Tomcat等服务简化了项目的构建配置为spring及第三方库提供自动配置提供生产级特性无需生成代码或者进行xml配置 二、四大核心 自动配置起步依赖命令行界面Actuator - 生成级的特性 三、自动配置的实现原理 …

C语言学习笔记-初阶(30)深入理解指针2

1. 数组名的理解 在上一个章节我们在使用指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0]; 这里我们使用 &arr[0] 的方式拿到了数组第⼀个元素的地址&#xff0c;但是其实数组名本来就是地址&…