利用AutoGpt將任何模型支援o1模型的推理實現

tokengo發表於2024-09-19

利用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微信社群群:

相關文章