教程
图片由 DALLE 提供。
感觉在编程方面有些生疏
我最近决定重新熟悉编程 Web 应用程序,目标是保持实际操作和相关性——特别是在具有挑战性的技术工作环境中。
我经常通过创建相对基本的 Web 应用程序来教自己各种编程概念,这些应用程序使用 API、数据库、库,并将它们组合成一个应用程序。
我发现,以这种方式创建应用程序,而不是严格练习乏味的 HackerRank 问题,不仅让我了解了技术生态系统中最新的概念,而且还建立了一个全新的项目组合(你可以在面试中讨论!)。
今天,事情有些不同
人工智能正在迅速改变软件开发的方式。
当一些影响者和媒体来源声称编程工作正在消失时,我相信情况正好相反。
我坚信,尽管人工智能将绝对提高我们创建应用程序的速度和效率,但它仍然会被人类开发者作为一个极其强大的工具所使用。
我认为了解如何在你的编程项目中使用人工智能非常重要。这正是我在构建一个简单的教程 Web 应用程序时试图做到的。
一个怪物创建数据库
我的目的是创建一个简单的 Web 应用程序,它会显示一个怪物表格,包括它们的名称、描述、健康、攻击和防御点。
每个怪物都可以通过点击怪物的名称并在网页内更改相关数据来在线编辑。一个保存和一个删除按钮将更新怪物或将其从数据库中删除。
数据将存储在本地 Sqlite 数据库中,这使得它易于共享且自包含。这也消除了注册第三方服务以托管数据库的需求。
怪物收集器是一个简单的 Web 应用程序,用于创建 AI 生成的怪物的数据库。来源:作者。
需要一些更神奇的东西
到目前为止,所有这些都可能听起来很平凡(然而,对于潜在的雇主来说,这非常有价值)。尽管如此,我还需要一些更现代的东西来让教程体验更加生动。
这就是人工智能发挥作用的地方!
在过去的几年里,我通常会随机生成要存储在数据库中的每个数据点。这为显示的数据的初始种群播种。
Random rand = new Random();
for (int i = 0; i < 10; i++)
{
// Generate a random number between 0 and 100.
int number = rand.Next(0, 100);
}
然而,我们正处于一场人工智能革命中!
我们可以告别随机数生成器,转而使用大型语言模型(LLM)!
再见,随机数。你好,AI
我不想从头开始训练一个 LLM,甚至将整个模型导入我的应用中,而是想调用一个网络服务 API,比如 ChatGPT。
使用 LLM 网络 API 服务更现实,尤其是在商业领域。大多数企业不训练自己的模型,但仍然想利用 AI 技术。
这正是使 AI 网络服务如此受欢迎的原因。
我决定将 Cohere 集成到我的网络应用程序中,并使用其文本生成服务,这与 ChatGPT 非常相似,用于为数据库生成创意怪物。
为创建怪物进行提示词工程
将 LLM 整合的第一步是构思一个提示词。
提示词只是一串文本,比如一个问题、陈述或任务,就像你会问 ChatGPT 一样。
“为地牢游戏中的恐怖怪物生成一个独特的创意怪物名称和描述。描述不应超过一句话。名称应包含三个或更少的单词,并且要具有创意和独特性。以以下格式输出结果:名称,描述。名称和描述必须由逗号分隔。
怪物的类型应该是 {monster.Name}。
{customPrompt}
怪物的名称不能包含以下任何名称。
我要求 LLM 生成一个创意怪物名称和描述。
提示词指定描述的长度应限制为一句话,这样更容易存储在数据库中并在 UI 中进行操作。
我还要求输出非常具体的名称,描述,用逗号分隔。这样,程序就可以解析 LLM 的输出并将其存储到我的应用程序和数据库表中的怪物对象中。
我们应该创建哪种类型的怪物?
虽然 LLM 会自己创建怪物,但我的应用程序指定的一部分是怪物的“类型”。
MonsterTypes = new() { "Dragon", "Goblin", "Troll", "Ogre", "Demon" }
以这种方式,我们为 LLM 提供了一种起点,以便从中生成怪物。提示词中有一个占位符,用于插入怪物的类型。
我还包含了一个已生成的怪物名称列表,这样 LLM 就可以避免创建我们已经见过的怪物。这些名称被附加到提示词的末尾。
最迷人的功能
我构思的提示词已经足够强大。
然而,我想知道如果我的应用程序的用户能够改变怪物的类型本身,那会多么有趣。为此,我可以在提示词中简单地包含一个“自定义”部分的占位符。
这就是应用程序中最迷人的功能之一被设计出来的地方。
随机数据的无限可能性
自定义提示词是网络应用程序的用户可以添加到提示词中的文本,以便进一步自定义创建的怪物类型。
例如,我们已经在指定怪物类型。然而,最终用户可以非常具有创意。他们可以包括诸如怪物应该像云一样高,覆盖着彩虹,并且吹奏美妙的音乐等细节!
有紫色绷带和脾气暴躁的哥布林,其留下的痕迹是压碎的骨头和破碎的梦想。
在为 LLM 制定详细的提示后,魔法就开始发挥作用。让我们把这些都结合起来。
初始化数据库
第一步是将初始怪物列表填充到数据库中。
每个怪物都由 LLM 创建。为此,我首先配置了一个依赖注入服务来调用Cohere AI服务并生成怪物。
new DatabaseInitializer(app.Services.GetRequiredService<LLM>(),
app.Services.GetRequiredService<MonsterFactory>()).InitializeDatabase();
上述代码初始化了 MonsterFactory 类以及我们的 LLM,由 Cohere 提供支持。然后程序初始化数据库。
创建初始批次的怪物
使用.NET Entity Framework 中的数据库上下文和保存我们生成的每个怪物来初始化数据库中的起始怪物列表。
using var context = new DatabaseContext();
List<string> existingNames = [];
// Generate monsters.
var monsters = new List<Monster>();
for (int i=0; i<10; i++)
{
var monster = monsterFactory.Create(existingNames);
monsters.Add(monster);
// Prevent duplicate names.
existingNames.Add(monster.Name);
}
// Add the monsters to the database.
context.Monsters.AddRange(monsters);
context.SaveChanges();
使数据生动起来
当 LLM 被调用并使用我们的神奇提示生成每个创意怪物时,真正的魔法就开始了。
// Call the LLM.
output = Llm.GetTextAsync(prompt, ignoreNames).GetAwaiter().GetResult();
// Parse the output for "name, description".
if (output is not null)
{
var parts = output.Split(",", 2);
monster.Name = parts[0];
monster.Description = parts[1];
Console.WriteLine($"Created {monster.Name}, {monster.Description}");
}
我们设置了怪物的名称和描述属性,这些属性是从 LLM 的输出中解析出来的。然后,我们将这些数据保存到数据库中。
允许用户按需创建怪物
为了使程序对用户更加互动,以及为了在应用程序中提供更有趣的讨论内容,我在用户界面中包含了一个 Add按钮。
添加按钮允许用户按需生成新的怪物,这也会被保存到数据库中。
当然,这就是我们包含自定义提示的地方。
[HttpPost()]
public IActionResult CreateMonster(CreateModel model)
{
// Load the exiting names of monsters.
var names = MonsterManager.Names();
// Generate a new monster with a user-specified prompt.
var monster = monsterFactory.Create(names, model.Prompt);
// Save the monster.
MonsterManager.Update(monster);
return new JsonResult(monster);
}
通过 MonsterController 实现用户创建新怪物的支持。这是一个网络服务方法,可以从 UI 中调用。
在生成新怪物后,我们将其保存到数据库中,就像我们在初始化初始数据时做的那样。
我学到了什么?
我已经编程很多年了。
我非常喜欢创建教程应用程序,这些应用程序展示了各种软件概念或以新颖的方式集成服务。这既让我对最新的软件概念有了更深入的了解,也提升了我的简历。
在我的教程应用程序中使用 AI 教会了我如何利用简单的想法,如为数据库生成随机数据,来发挥乐趣和力量。
从随机数据转向 AI
与使用随机数字或一系列的if-then条件来创建数据相比,我发现 LLM 的力量让我能够描绘出一个更加富有创意的画面,使应用程序生动起来。
更重要的是,使用 LLM 网络 API 服务教会了我如何轻松地调用强大的 AI 服务并将其集成到我的程序中。
图片由Tima Miroshnichenko拍摄。
扩展求职面试的技能组合
作为了解新技术的一个额外奖励,这次经历也可以成为一次令人惊叹的谈话开场白,在技术工作面试中,甚至可以是一次完整的架构讨论。
没有比讨论你真正喜欢创建的项目更简单的面试类型了。我发现,在教程程序中集成先进的技术,如 AI 和 LLMs,是一个极好的学习机会。
让你的应用程序栩栩如生
当然,我学到的最重要的事情是与 AI 一起工作是多么有趣。
将 AI 集成到我的应用程序中,即使是一个基本的教程,也像是从用灰度画图转变为使用纯粹的奇妙色彩!
经验让我看到了使用 AI 的乐趣。它也表明,这不需要是一个复杂的任务,任何人都可以做到!所以,大胆地去画你的画吧。
我强烈推荐你尝试一下!
你可以从这里下载这个故事完整的源代码。
4021

被折叠的 条评论
为什么被折叠?



