在本地运行大型语言模型——您自己的类似ChatGPT的C#语言AI

本文介绍了如何在本地使用开源模型LLaMA,如SciSharp/LLamaSharp,避免依赖云端服务,实现在C#中创建自己的AI聊天机器人。作者分享了从下载模型、安装LLamaSharp到创建聊天会话的步骤,展示了本地运行的可能性和性能对比。
摘要由CSDN通过智能技术生成

目录

迈向开源模型和执行——一点点历史......

SciSharp/LLamaSharp入门

1. 下载模型

2. 创建控制台应用程序并安装LLamaSharp

3. 初始化LLaMA模型并创建聊天会话

结束语


在过去的几个月里,科技界和主流媒体上的许多新闻都围绕着ChatGPT,这是OpenAI的人工智能(AI)产品。ChatGPT是一种针对对话进行微调的大型语言模型(LLM)。虽然这句话低估了这项技术,但它是一个看起来很聪明的聊天机器人,您可以询问有关各种领域的问题。

直到最近,使用这些LLM还需要依赖第三方服务和云计算平台。要将任何LLM集成到您自己的应用程序中,或者只是使用一个LLM,您必须使用OpenAI,Microsoft Azure或其他应用程序刷信用卡。

但是,随着硬件和软件的进步,现在可以在您自己的机器和/或服务器上本地运行这些模型。

在这篇文章中,我们将看到如何让自己的AI由直接在CPU上运行的大型语言模型提供支持!

迈向开源模型和执行——一点点历史......

在OpenAI发布ChatGPT几个月后,Meta发布了LLaMA。LLaMA模型仅用于研究目的,必须向Meta提出要求。

然而,有人泄露了LLaMA的权重,这在互联网上引发了很多活动。您可以在许多地方找到可供下载的模型,并在您自己的硬件上使用它(请注意,LLaMA仍受非商业许可的约束)。

Alpaca是斯坦福大学(Standford)微调的LLaMA模型。还有Vicuna,另一个微调的LLaMA模型。还有WizardLM,还有......

你明白了:LLaMA吐出一堆其他随时可用的模型(对不起双关语)。

当社区的一部分人正在训练新模型时,其他人正在努力使这些LLM在消费类硬件上运行成为可能。Georgi Gerganov发布了llama.cpp,这是一个C++实现,可以在CPU上运行LLaMA模型(和衍生物)。它现在可以运行各种模型:LLaMA、Alpaca、GPT4All、Vicuna、Koala、OpenBuddy、WizardLM 等。

还有许多语言的包装器:

让我们测试一下该列表中的最后一个!

SciSharp/LLamaSharp入门

您听说过SciSharp Stack吗?他们的目标是成为一个开源生态系统,将所有主要的ML/AI框架从Python带到.NET——包括通过SciSharp/LLamaSharp的LLaMA(和朋友)。

LlamaSharp是LLaMA模型的.NET的llama.cpp绑定,并提供API以使用LLaMA模型。它适用于Windows和Linux,不需要您考虑llama.cpp底层。在撰写本文时,它不支持macOS。

现在,您需要什么才能开始?

由于您需要一个模型来使用,因此让我们先对其进行排序。

1. 下载模型

LLamaSharp适用于多种模型,但支持取决于您使用的LLamaSharp版本。支持的模型在README中链接,请去探索一下。

在这篇博文中,我们将使用LLamaSharp版本0.3.0(撰写本文时的最新版本)。我们还将使用WizardLM模型,更具体地说是wizardLM-7B.ggmlv3.q4_1.bin模型。它在推理的准确性和速度之间提供了一个很好的组合,这很重要,因为我们将在CPU上使用它。

有许多更准确的模型(或更快、更不准确的模型),因此请尝试一下最有效的模型。在任何情况下,请确保您有2.8GB到8GB的磁盘空间用于此型号的变体,以及最多10GB的内存。

2. 创建控制台应用程序并安装LLamaSharp

使用您喜欢的IDE,创建一个新的控制台应用程序,并复制到您刚刚下载的模型中。接下来,安装LLamaSharpLLamaSharp.Backend.Cpu包。如果您有Cuda GPU,您还可以使用Cuda后端包。

以下是我们的项目:

有了这些,我们就可以开始创建我们自己的聊天机器人,该机器人在本地运行,不需要OpenAI即可运行。

3. 初始化LLaMA模型并创建聊天会话

Program.cs中,从以下代码片段开始,加载我们刚刚下载的模型:

using LLama;

var model = new LLamaModel(new LLamaParams(
    model: Path.Combine("..", "..", "..", "Models", "wizardLM-7B.ggmlv3.q4_1.bin"),
    n_ctx: 512,
    interactive: true,
    repeat_penalty: 1.0f,
    verbose_prompt: false));

此代码片段从您在上一步中存储下载的模型的目录中加载模型。它还传递了其他几个参数(并且比此示例中的参数更多)。

供参考:

  • n_ctx——输入序列中的最大标记数(换句话说,您的问题/提示可以有多少个标记)。
  • interactive——指定您希望在提示之间保留上下文,以便可以在以前的结果基础上进行构建。这使得模型的行为类似于聊天。
  • repeat_penalty——确定对长响应的惩罚(并有助于使响应更加切中要害)。
  • verbose_prompt——切换详细程度。

同样,还有更多可用的参数,其中大部分在llama.cpp存储库中进行了解释

接下来,我们可以使用我们的模型来启动聊天会话:

var session = new ChatSession<LLamaModel>(model)
    .WithPrompt(...)
    .WithAntiprompt(...);

当然,这些...不会编译,但让我们首先解释一下聊天会话需要什么。

.WithPrompt()(或.WithPromptFile())方法指定模型的初始提示。这可以留空,但通常是LLM的一组规则。在llama.cpp存储库中找到一些示例提示,或编写自己的提示。

.WithAntiprompt()方法指定反提示,这是LLM在预期用户输入时将显示的提示。

以下是与荷马辛普森(Homer Simpson)的LLM设置聊天会话的方法:

var session = new ChatSession<LLamaModel>(model)
    .WithPrompt("""
        You are Homer Simpson, and respond to User with funny Homer Simpson-like comments.

        User:
        """)
    .WithAntiprompt(new[] { "User: " });

我们稍后会看到这个荷马辛普森模型给出的结果,但一般来说,你会希望更详细地了解对LLM的期望。下面是名为“LocalLLM”的模型的聊天会话设置示例,该模型对结对程序员很有帮助:

var session = new ChatSession<LLamaModel>(model)
    .WithPrompt("""
        You are a polite and helpful pair programming assistant.
        You MUST reply in a polite and helpful manner.
        When asked for your name, you MUST reply that your name is 'LocalLLM'.
        You MUST use Markdown formatting in your replies when the content is a block of code.
        You MUST include the programming language name in any Markdown code blocks.
        Your code responses MUST be using C# language syntax.

        User:
        """)
    .WithAntiprompt(new[] { "User: " });

现在我们有了聊天会话,我们可以开始与它交互了。读取输入和打印LLM输出需要一些额外的代码。

Console.WriteLine();
Console.Write("User: ");
while (true)
{
    Console.ForegroundColor = ConsoleColor.Green;
    var prompt = Console.ReadLine() + "\n";

    Console.ForegroundColor = ConsoleColor.White;
    foreach (var output in session.Chat(prompt, encoding: "UTF-8"))
    {
        Console.Write(output);
    }
}

差不多就是这样。session变量中的聊天会话是使用其.Chat()方法提示的,并且所有输出都逐个令牌返回,就像任何生成模型一样。

你想看到它的实际效果,对吧?这是“荷马辛普森聊天”的实际效果:

更有用的“C#结对程序员聊天”:

很不错,不是吗?

在我的Windows笔记本电脑 (i7-10875H CPU @ 2.30GHz) 上,推理肯定比使用ChatGPT时慢,但它肯定是可行的。

结束语

由于硬件需求,使用LLM一直需要第三方服务和云平台,例如OpenAI的ChatGPT。

在这篇文章中,我们了解了开源大型语言模型的一些历史,以及模型本身以及周围社区如何使在本地运行这些模型成为可能。

我很想听听您将使用这种方法构建什么!

https://blog.maartenballiauw.be/post/2023/06/15/running-large-language-models-locally-your-own-chatgpt-like-ai-in-csharp.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值