首页 > 其他分享 >利用AutoGpt将任何模型支持o1模型的推理实现

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

时间:2024-09-19 23:23:38浏览次数:9  
标签:AutoGpt string 模型 Redis RabbitMQ 缓存 key var o1

利用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)
    {
        // 初始化Redis
        redis = ConnectionMultiplexer.Connect("localhost");
        
        // 初始化RabbitMQ
        var 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);
        
        // 发送消息到RabbitMQ
        var 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微信社区群:

标签:AutoGpt,string,模型,Redis,RabbitMQ,缓存,key,var,o1
From: https://www.cnblogs.com/hejiale010426/p/18421581

相关文章

  • 如何在Java中实现多种深度学习模型的集成学习
    如何在Java中实现多种深度学习模型的集成学习大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!集成学习是一种通过组合多个模型来提高预测性能的技术。通过将不同模型的优势结合起来,集成学习可以有效地提高模型的准确性和鲁棒性。在深度学习领域,集成......
  • Java中的高效模型压缩技术:从剪枝到知识蒸馏
    Java中的高效模型压缩技术:从剪枝到知识蒸馏大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!随着深度学习模型在各种任务中的广泛应用,模型的规模和复杂度也在不断增加。然而,较大的模型通常会占用大量的计算资源和内存,使其在资源有限的设备上(如移动设......
  • day4[大模型全链路开源开放体系学习小结]
    书生·浦语大模型全链路开源开放体系涵盖数据收集、标注、训练、微调、评测、部署等全链路,学习了解其技术发展、性能提升、模型架构、开源生态等。书生·浦语大模型(英文名INTurnLLM)多次开源,性能不断提升,达到国际先进水平,在推理能力、上下文记忆、自主规划等方面表现优异,可应用......
  • 【大模型开发】 迎接AI新时代:Qwen2.5发布,超越LLaMA3!如何通过一键API调用不同模型?(附源
    迎接AI新时代:Qwen2.5发布,超越LLaMA3!如何通过一键API调用不同模型?人工智能领域迎来了新的突破,阿里巴巴近期发布了全新的Qwen2.5模型系列,凭借其72B参数的核心模型,不仅在参数量上显著优化,还成功超越了LLaMA3(405B),在多个自然语言处理和代码生成任务中取得了卓越的表现。Qwen......
  • 大模型-调用星火大模型api进行翻译-04
    目录1.描述2代码1.描述项目描述:本项目使用了streamlit框架来构建前端,展示一些标语、输入框和按钮。后端的大模型是星火大模型V3.0版本。项目运行说明:1、首先,从开放平台获取密钥信息,用于调用星火大模型时的鉴权密钥(前提是已经获得了token授权)。获取地址:https://console.xf......
  • 1-bit 大模型(LLM)时代的到来
     人工智能咨询培训老师叶梓转载标明出处模型规模的扩大带来了部署上的挑战,并因其高能耗引对环境和经济产生了影响。为了应对这些挑战,研究者们开始探索使用低位宽量化技术来降低模型的推理成本,同时保持模型性能。微软公司和中国科学院大学的研究团队提出了一种名为BitNetb1.......
  • LLM - 理解 多模态大语言模型(MLLM) 的 评估(Evaluation) 与相关技术 (六)
    欢迎关注我的CSDN:https://spike.blog.csdn.net/本文地址:https://spike.blog.csdn.net/article/details/142364884免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。评估(Evaluation)是研发多模态大语言模型(MLLM)的重要部分,也为模型的优化提......
  • 大语言模型都能做什么
    与一般的AI模型相比,大模型的参数特别多(通常在10亿以上),训练时需要大规模的数据(动辄百万计,往往还需要进行大量的人工标注),可见大模型的训练成本通常比较高昂。当前AI的本质能力上是预测:AI能通过大数据训练,总结过去的规律,预测未来。比如我们问AI:“内蒙古的首府是哪个城市?”,其实AI并......
  • 14、程序的内存模型
    ......
  • 大模型-提示词工程-句子对语义匹配-03
    目录1.提示工程2.代码1.提示工程[('现在你需要帮助我完成文本匹配任务,当我给你两个句子时,你需要回答我这两句话语义是否相似。只需要回答是否相似,不要做多余的回答。','好的,我将只回答”是“或”不是“。'),('句子一:公司ABC发布了季度财报,显示盈利增长。\n句子二......