利用AutoGpt将任何模型支持o1模型的推理实现

news/2024/12/23 5:33:56/文章来源:https://www.cnblogs.com/hejiale010426/p/18421581

利用AutoGpt将任何模型支持o1模型的推理实现

相信大家都对于OpenAI最新出的o1模型都非常关注,它已经能通过推理让回复的效果更加理想,

但是目前o1的限制太大,而且使用o1至少也是需要购买OpenAI官方的会员价格也在20美刀(好贵!!),于是乎社区出现非常多相似的实现,通过更低成本得到更好的效果,然后我们的AutoGpt借鉴了https://github.com/bklieger-groq/g1python的代码实现,实现了一个.NET AutoGpt自动推理SDK,你可以利用AIDotNet.AutoGpt也能将普通模型支持推理实现,下面我们展示一下AIDotNet.AutoGpt的入门教程

入门AIDotNet.AutoGpt

创建项目AutoGpt.Tests控制台程序

然后安装NuGet包

dotnet add package AIDotNet.AutoGpt

安装完成以后打开我们的AI平台http://api.token-ai.cn/注册一个账号,然后登录到控制台,打开AI服务/令牌,然后点击复制Key

using System.Diagnostics;using AutoGpt;var service = new ServiceCollection().AddAutoGpt((options =>{options.Endpoint = "https://api.token-ai.cn/";options.NumOutputs = 5;}));var serviceProvider = service.BuildServiceProvider();var autoGptClient = serviceProvider.GetRequiredService<AutoGptClient>();var sw = Stopwatch.StartNew();
await foreach (var (title, content, totalThinkingTime) in autoGptClient.GenerateResponseAsync("c#使用Redis+RabbitMQ实现多级缓存", "sk-", "gpt-4o-mini-2024-07-18", 2000))
{if (title.StartsWith("Final Answer")){Console.ForegroundColor = ConsoleColor.Green;Console.Write(content);Console.ResetColor();}else{Console.WriteLine(title);Console.WriteLine(content);}
}Console.WriteLine();sw.Stop();Console.WriteLine("生成总耗时:" + sw.ElapsedMilliseconds + "ms");

Options中的Endpoint是访问的AI API端点,然后NumOutputs则是推理最大次数。

然后拿到我们的autoGptClient调用GenerateResponseAsync方法,传递promptc#使用Redis+RabbitMQ实现多级缓存,然后把sk-替换成我们刚刚在平台复制的Key,然后模型可以自己选择,默认使用gpt-4o-mini成本会更低,2000则是响应的最token数量。

然后如果title 前缀是Final Answer那么数据分析完成,得到content则是实际对话响应内容。

尝试推理对话效果。

实现一个基于Redis和RabbitMQ的多级缓存系统,可以有效提高数据访问速度和系统的可扩展性。以下是详细的步骤和示例代码,帮助你在C#中实现这个系统。### 1. 环境准备确保你已经安装了以下组件:
- **Redis**:可以在本地或使用云服务。
- **RabbitMQ**:同样可以在本地或使用云服务。
- **C#开发环境**:如Visual Studio。### 2. 安装必要的NuGet包在你的C#项目中,安装以下NuGet包:
```bash
Install-Package StackExchange.Redis
Install-Package RabbitMQ.Client
```### 3. Redis缓存实现首先,我们需要创建一个Redis缓存的管理类。```csharp
using StackExchange.Redis;
using System;public class RedisCache
{private readonly IDatabase _database;public RedisCache(string connectionString){var redis = ConnectionMultiplexer.Connect(connectionString);_database = redis.GetDatabase();}public void Set(string key, string value, TimeSpan? expiry = null){_database.StringSet(key, value, expiry);}public string Get(string key){return _database.StringGet(key);}public void Delete(string key){_database.KeyDelete(key);}
}
```### 4. RabbitMQ消息处理接下来,我们需要创建一个RabbitMQ的管理类,用于发送和接收消息。```csharp
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;public class RabbitMqService
{private readonly IConnection _connection;private readonly IModel _channel;public RabbitMqService(string hostName){var factory = new ConnectionFactory() { HostName = hostName };_connection = factory.CreateConnection();_channel = _connection.CreateModel();_channel.QueueDeclare(queue: "cache_invalidation",durable: false,exclusive: false,autoDelete: false,arguments: null);}public void SendMessage(string message){var body = Encoding.UTF8.GetBytes(message);_channel.BasicPublish(exchange: "",routingKey: "cache_invalidation",basicProperties: null,body: body);}public void StartListening(Action<string> onMessageReceived){var consumer = new EventingBasicConsumer(_channel);consumer.Received += (model, ea) =>{var body = ea.Body.ToArray();var message = Encoding.UTF8.GetString(body);onMessageReceived(message);};_channel.BasicConsume(queue: "cache_invalidation",autoAck: true,consumer: consumer);}
}
```### 5. 整合Redis和RabbitMQ在你的应用程序中,整合Redis和RabbitMQ,处理数据的缓存和失效。```csharp
public class CacheService
{private readonly RedisCache _redisCache;private readonly RabbitMqService _rabbitMqService;public CacheService(string redisConnectionString, string rabbitMqHostName){_redisCache = new RedisCache(redisConnectionString);_rabbitMqService = new RabbitMqService(rabbitMqHostName);// 启动监听_rabbitMqService.StartListening(OnCacheInvalidation);}public string GetData(string key){// 先从Redis获取数据var cachedData = _redisCache.Get(key);if (cachedData != null){_rabbitMqService.SendMessage(key);}private void OnCacheInvalidation(string key){// 接收到失效消息后,删除Redis中的缓存_redisCache.Delete(key);}private string GetDataFromDatabase(string key){// 模拟从数据库获取数据return $"Data for {key}";}private void UpdateDatabase(string key, string newValue){// 模拟更新数据库Console.WriteLine($"Database updated: {key} = {newValue}");}
}
```### 6. 使用示例最后,在你的主程序中使用这个缓存服务。```csharp
class Program
{static void Main(string[] args){var cacheService = new CacheService("localhost:6379", "localhost");// 获取数据var data = cacheService.GetData("key1");Console.WriteLine(data);// 更新数据cacheService.UpdateData("key1", "New Value");// 再次获取数据var updatedData = cacheService.GetData("key1");Console.WriteLine(updatedData);}
}
```### 7. 总结以上代码展示了如何在C#中使用Redis和RabbitMQ实现一个简单的多级缓存系统。通过Redis来快速存取数据,并使用RabbitMQ来处理缓存失效的消息,从而保持数据的一致性。你可以根据具体需求扩展和优化这个系统,例如添加错误处理、日志记录等功能。

未使用推理对话效果

在C#中使用Redis和RabbitMQ实现多级缓存的架构可以提高应用的性能和响应速度。下面是一个简单的实现思路和代码示例:### 1. 系统架构- **Redis**: 用作快速缓存存储,适合存储频繁访问的数据。
- **RabbitMQ**: 用作消息队列,处理数据更新或缓存失效的通知。### 2. 安装依赖确保你在项目中安装了以下NuGet包:```bash
Install-Package StackExchange.Redis
Install-Package RabbitMQ.Client
```### 3. 实现逻辑以下是一个简单的实现示例:```csharp
using StackExchange.Redis;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;class Program
{private static ConnectionMultiplexer redis;private static IConnection rabbitConnection;private static IModel rabbitChannel;static void Main(string[] args){// 初始化Redisredis = ConnectionMultiplexer.Connect("localhost");// 初始化RabbitMQvar factory = new ConnectionFactory() { HostName = "localhost" };rabbitConnection = factory.CreateConnection();rabbitChannel = rabbitConnection.CreateModel();rabbitChannel.QueueDeclare(queue: "cache_updates", durable: false, exclusive: false, autoDelete: false, arguments: null);// 启动RabbitMQ消费者var consumer = new EventingBasicConsumer(rabbitChannel);consumer.Received += Consumer_Received;rabbitChannel.BasicConsume(queue: "cache_updates", autoAck: true, consumer: consumer);// 示例数据操作SetData("key1", "value1");// 等待用户输入Console.ReadLine();}static void SetData(string key, string value){var db = redis.GetDatabase();db.StringSet(key, value);// 发送消息到RabbitMQvar body = Encoding.UTF8.GetBytes(key);rabbitChannel.BasicPublish(exchange: "", routingKey: "cache_updates", basicProperties: null, body: body);}static void Consumer_Received(object sender, BasicDeliverEventArgs e){var key = Encoding.UTF8.GetString(e.Body.ToArray());var db = redis.GetDatabase();// 从Redis删除缓存db.KeyDelete(key);Console.WriteLine($"Cache for {key} has been invalidated.");}
}
```### 4. 代码说明- **Redis连接**: 使用`StackExchange.Redis`库连接Redis。
- **RabbitMQ连接**: 使用`RabbitMQ.Client`库连接RabbitMQ,并创建一个消息队列`cache_updates`。
- **数据设置**: `SetData`方法将数据存入Redis,并发送消息到RabbitMQ。
- **消费者**: 在`Consumer_Received`中,接收来自RabbitMQ的消息并从Redis中删除相应的缓存。### 5. 运行示例1. 确保Redis和RabbitMQ服务正在运行。
2. 编译并运行上述代码。
3. 通过调用`SetData`方法设置数据并触发缓存更新。### 6. 扩展- **缓存读取**: 你可以扩展代码,加入从Redis读取数据的逻辑。
- **错误处理**: 增加异常处理和日志记录。
- **配置管理**: 将Redis和RabbitMQ的连接字符串放在配置文件中。这个示例提供了一个基础的多级缓存实现,具体的应用场景和需求可以根据项目需要进行调整和优化。

AI评分

### 智能推理内容评分:8/10**优点:**
1. **详细性**:提供了完整的代码示例和逐步的实现步骤,便于开发者理解和实践。
2. **结构清晰**:内容分为多个部分,易于导航,逻辑清晰。
3. **集成示例**:展示了如何将Redis和RabbitMQ结合使用,适合需要实现多级缓存的开发者。**缺点:**
1. **复杂性**:对于初学者来说,Redis和RabbitMQ的概念可能会比较复杂,缺乏简单的解释。
2. **缺少错误处理示例**:虽然提到可以扩展,但没有具体的错误处理示例。### 普通内容评分:7/10**优点:**
1. **简洁性**:代码相对简单,适合初学者理解基本概念。
2. **基础实现**:提供了一个简单的实现思路,适合快速入门。**缺点:**
1. **缺乏深度**:没有详细的步骤说明,可能对初学者不够友好。
2. **功能有限**:示例代码功能较少,没有展示如何处理缓存失效的完整流程。### 总结**哪个效果更好:** 智能内容效果更好。虽然普通内容更简洁,但智能内容提供了更全面的实现细节和背景信息,适合需要深入理解和实施的开发者。智能内容的结构和示例更有助于开发者在实际项目中应用。

结束

https://open666.cn/ 已经接入了自动推理功能

如果您想分享DotNet技术qq群:

AIDotNet微信社区群:

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

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

相关文章

C语言类型与强制类型转换

目录类型关键字sizeof如何理解强制类型转化不同类型的0null字符设备(补充) char有有符号和无符号两种类型,字符是无符号类型.(补充) getchar的返回值为什么是int键盘输入的内容,以及往显示器中打印的内容,都是字符 --> 键盘/显示器称为字符设备 类型C语言为何有类型? 让我们…

如何在 ASP.NET Core Web API 方法执行前后 “偷偷“ 作一些 “坏“ 事?初识 ActionFilterAttribute

ActionFilterAttribute 是一种作用于控制器 Action 方法的特性(Attribute),通过它,你可以在操作执行前后、异常处理时等不同的阶段插入自定义逻辑。 比如在执行操作方法之前修改请求参数、记录日志、进行权限验证等操作,在执行操作方法之后发送邮件、同步数据等等。 本文主…

访问Github卡顿甚至进不去的解决办法(适用于Windows)

本文使用Watt Tookit(原Steam++)解决了Github在国内访问速度卡顿甚至无反应的问题,通过NDM和镜像网站实现Github大文件高速下载。本文首发自个人博客:点我查看 一、前言 Github 是全球知名的开源宝库,但是对国内用户并不友好。当我们在浏览器中输入www.github.com时,如果…

看看mysql干的恶心事

如图: 本文来自博客园,作者:河北大学-徐小波,转载请注明原文链接:https://www.cnblogs.com/xuxiaobo/p/18421514

LoRaWAN网关价格干穿地板了

曾经LoRaWAN网关要上万块钱一台,后来卷到千把块钱,现在可以卷到500以内,还支持4G/ETH/WIFI,应该也是没谁了。 先上图片1.1 产品特点 ◆ 高性能嵌入式硬件平台 ◆ 使用工业级 Cat.1 4G 模块 ◆ 宽压输入 DC 9~28V,工业级稳定性 ◆ 群脉冲:电源2kV,通讯线4kV ◆ 湿度范围…

认知神经科学分析指标——图论指标之全局集群系数

图论指标在认知神经科学或脑科学的研究中,通常作为研究脑网络表现的描述性指标之一,而图论指标从全局性来分可以分为:节点指标和全局指标,而根据描述脑网络整合性表现又可分为:整合指标和分离指标。 该随笔主要涉及图论指标中全局指标及整合指标的全局集群系数,英文全称为…

day4[大模型全链路开源开放体系学习小结]

书生浦语大模型全链路开源开放体系涵盖数据收集、标注、训练、微调、评测、部署等全链路,学习了解其技术发展、性能提升、模型架构、开源生态等。 书生浦语大模型(英文名IN Turn LLM)多次开源,性能不断提升,达到国际先进水平,在推理能力、上下文记忆、自主规划等方面表现…

深入理解ConcurrentHashMap

HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进行put操作,调用了HashMap的putVal(),具体原因:假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的;当线程A执行完第六行由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元…

成都仪器定制-二进制补码及与原码的互相转换方法

大沙把一些基础的知识说清楚,本文介绍二进制补码及与原码的转换方法。 先说原码,原码‌是一种计算机中对数字的二进制定点表示方法。在原码表示法中,数值前面增加了一位符号位,最高位为符号位,0表示正数,1表示负数。其余位表示数值的大小。二进制补码‌是一种用于表示有符…

函数进阶应用3

认识OFFSET函数函数格式 参数说明 作用OFFSET(参数1,参数2,参数3,参数4,参数5) 参数1:以谁为标准参数2:下一多少行参数3:右移多少列参数4:取几行参数5:取几列 动态获取数据应用:使用offset函数获取表格最后五行数据,并计算平均值 在空白单元格输入“=offset()”,然…

程序员编写技术文章需要的四个辅助神器 ,强烈建议收藏 !

编写技术文章是程序员分享经验和记录学习成果的重要方式。 为了让写作变得更轻松,有许多实用工具可以帮助提升效率,比如 Markdown 编辑器、画图工具等。 接下来,笔者将介绍四款简单实用的工具,帮助程序员更轻松地编写技术文章。1 Typora :Markdown 编辑器 Typora 是一款简…

【专题】2024年9月游戏行业报告合集汇总PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p=37732 在当今数字化高速发展的时代,游戏行业已然成为了文化与科技融合的前沿阵地。中国游戏行业凭借着不断创新的技术、丰富多元的内容以及日益拓展的市场,正以蓬勃之姿在全球舞台上绽放光彩。阅读原文,获取专题报告合集全文,解锁文末153份…