ETJava Beta | Java    注册   登录
  • 搜索:
  • 利用AutoGpt将任何模型支持o1模型的推理实现

    发表于      阅读(67)     博客类别:Crawler     转自: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)
        {
            // 初始化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微信社区群: