首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年09月19日 22:28

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

From:https://www.cnblogs.com/hejiale010426/p/18421581
本文地址: http://www.shuzixingkong.net/article/2142
0评论
提交 加载更多评论
其他文章 LoRaWAN网关价格干穿地板了
曾经LoRaWAN网关要上万块钱一台,后来卷到千把块钱,现在可以卷到500以内,还支持4G/ETH/WIFI,应该也是没谁了。 先上图片 1.1 产品特点 ◆ 高性能嵌入式硬件平台 ◆ 使用工业级 Cat.1 4G 模块 ◆ 宽压输入 DC 9~28V,工业级稳定性 ◆ 群脉冲:电源&#177;2k
LoRaWAN网关价格干穿地板了 LoRaWAN网关价格干穿地板了 LoRaWAN网关价格干穿地板了
程序员编写技术文章需要的四个辅助神器 ,强烈建议收藏 !
编写技术文章是程序员分享经验和记录学习成果的重要方式。 为了让写作变得更轻松,有许多实用工具可以帮助提升效率,比如 Markdown 编辑器、画图工具等。 接下来,笔者将介绍四款简单实用的工具,帮助程序员更轻松地编写技术文章。 1 Typora :Markdown 编辑器 Typora 是一款简洁而
程序员编写技术文章需要的四个辅助神器 ,强烈建议收藏 ! 程序员编写技术文章需要的四个辅助神器 ,强烈建议收藏 ! 程序员编写技术文章需要的四个辅助神器 ,强烈建议收藏 !
深入理解ConcurrentHashMap
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进行put操作,调用了HashMap的putVal(),具体原因: 假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的; 当线程A执行完第六行由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处
深入理解ConcurrentHashMap 深入理解ConcurrentHashMap 深入理解ConcurrentHashMap
Windows 调试工具课程
本文是我在集团内部上的课程记录而成的博客内容。在本次课程里面将和大家介绍一些在 Windows 上常用的调试工具,以及调查问题的常见套路。适合于伙伴们入门 Windows 调试 本文以下内容是采用原本课程课件里面的一页页的内容组装而来,过程中补充一些讲课时的内容 本次课程里面核心的内容是调试工具,调
Windows 调试工具课程 Windows 调试工具课程 Windows 调试工具课程
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
在Python中,接口和抽象基类(Abstract Base Classes, ABCs)都用于定义类的结构和强制子类实现特定的方法,Python 没有内建的接口机制,但可以通过抽象基类(ABC)来模拟接口的行为。
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类 全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类 全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
.NET常见的几种项目架构模式,你知道几种?(附带使用情况投票)
前言 项目架构模式在软件开发中扮演着至关重要的角色,它们为开发者提供了一套组织和管理代码的指导原则,以提高软件的可维护性、可扩展性、可重用性和可测试性。 假如你有其他的项目架构模式推荐,欢迎在文末留言&#129310;!!! 项目架构模式使用情况收集(微信投票,请在微信中打开参与):https://
.NET常见的几种项目架构模式,你知道几种?(附带使用情况投票) .NET常见的几种项目架构模式,你知道几种?(附带使用情况投票) .NET常见的几种项目架构模式,你知道几种?(附带使用情况投票)
Parquet.Net: 将 Apache Parquet 移植到 .NET
Parquet.Net 是一个用于读取和写入 Apache Parquet 文件的纯 .NET 库,使用MIT协议开源,github仓库:https://github.com/aloneguid/parquet-dotnet。Apache Parquet 是一种面向大数据的列式存储格式。Parque
Parquet.Net: 将 Apache Parquet 移植到 .NET
【VMware VCF】使用 VCF Import Tool 将现有 vSphere 环境转换为管理域。
VMware Cloud Foundation 5.2 发布并引入了一个新的功能,借助 VCF Import Tool 工具可以将现有 vSphere 环境直接转换(Convert)为管理工作负载域或者导入(Import)为 VI 工作负载域。通过这种能力,客户无需购买新硬件和进行复杂的部署和迁移工
【VMware VCF】使用 VCF Import Tool 将现有 vSphere 环境转换为管理域。 【VMware VCF】使用 VCF Import Tool 将现有 vSphere 环境转换为管理域。 【VMware VCF】使用 VCF Import Tool 将现有 vSphere 环境转换为管理域。