赞
踩
目录
在过去的几个月里,科技界和主流媒体上的许多新闻都围绕着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 Stack吗?他们的目标是成为一个开源生态系统,将所有主要的ML/AI框架从Python带到.NET——包括通过SciSharp/LLamaSharp的LLaMA(和朋友)。
LlamaSharp是LLaMA模型的.NET的llama.cpp绑定,并提供API以使用LLaMA模型。它适用于Windows和Linux,不需要您考虑llama.cpp底层。在撰写本文时,它不支持macOS。
现在,您需要什么才能开始?
由于您需要一个模型来使用,因此让我们先对其进行排序。
LLamaSharp适用于多种模型,但支持取决于您使用的LLamaSharp版本。支持的模型在README中链接,请去探索一下。
在这篇博文中,我们将使用LLamaSharp版本0.3.0(撰写本文时的最新版本)。我们还将使用WizardLM模型,更具体地说是wizardLM-7B.ggmlv3.q4_1.bin模型。它在推理的准确性和速度之间提供了一个很好的组合,这很重要,因为我们将在CPU上使用它。
有许多更准确的模型(或更快、更不准确的模型),因此请尝试一下最有效的模型。在任何情况下,请确保您有2.8GB到8GB的磁盘空间用于此型号的变体,以及最多10GB的内存。
使用您喜欢的IDE,创建一个新的控制台应用程序,并复制到您刚刚下载的模型中。接下来,安装LLamaSharp和LLamaSharp.Backend.Cpu包。如果您有Cuda GPU,您还可以使用Cuda后端包。
以下是我们的项目:
有了这些,我们就可以开始创建我们自己的聊天机器人,该机器人在本地运行,不需要OpenAI即可运行。
在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));
此代码片段从您在上一步中存储下载的模型的目录中加载模型。它还传递了其他几个参数(并且比此示例中的参数更多)。
供参考:
同样,还有更多可用的参数,其中大部分在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。
在这篇文章中,我们了解了开源大型语言模型的一些历史,以及模型本身以及周围社区如何使在本地运行这些模型成为可能。
我很想听听您将使用这种方法构建什么!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。