在快速原型设计领域,Google AI Studio 堪称一款低门槛且强大的工具,尤其在生成式AI方面。 它可以让我们迅速迭代提示词、测试不同的大模型并即时看到结果,这对于探索生成式AI概念来说是一个真正的游乐场。然而,对于像我这样的C#开发者来说,AI Studio 的“获取代码”功能一直存在一个缺憾:它仅提供 Python、Node.js、TypeScript、REST/curl 以及最近新增的 Java、Kotlin、Swift 和 Dart 代码片段,唯独缺少了对C#的支持。虽然这只是一个小小的遗憾,但确实让我在将 AI Studio 中构建的原型无缝集成到 .NET 应用程序时遇到了一点阻碍。幸运的是,我们可以利用Gemini模型的强大功能,巧妙地绕过这个限制,生成所需的C#代码,从而加速我们的开发流程。

AI Studio:快速原型设计的核心平台

AI Studio 的核心优势在于其简洁易用的界面,以及对多种大模型的支持。开发者可以通过简单的拖拽和配置,快速构建原型系统。举例来说,如果我们要构建一个基于大模型的文本摘要应用,只需要在AI Studio 中选择合适的模型(如 Gemini),然后设置输入和输出的格式,就可以快速生成一个可用的原型。这种快速原型设计的方式,极大地降低了开发门槛,让更多的开发者可以参与到AI的创新中来。根据Google的官方数据,使用 AI Studio 的开发者,平均可以将原型设计的周期缩短 40% 以上。

Gemini:代码生成的强大助手

面对 AI Studio 不直接提供 C# 代码的问题,我们可以巧妙地借助 Gemini 本身来生成 C# 代码。其基本思路是:利用 AI Studio 提供的 REST/curl 代码作为蓝图,然后通过精心设计的提示词,让 Gemini 将其转换为 C# 代码。这其实是一个“以其人之道,还治其人之身”的策略。

例如,我们可以创建一个提示词,告诉 Gemini :“请将以下 curl 请求转换为 C# 代码,并使用 System.Net.Http.HttpClient 与 Gemini API 交互。函数应接受 API 密钥(字符串)和用户喜爱的电影列表(字符串)作为参数。它应将此信息发送到 Gemini API,并将 模型 的电影推荐作为单个字符串返回。提供此函数的完整 C# 代码,包括必要的 using 语句。”然后,将 AI Studio 生成的 curl 命令粘贴到提示词中,Gemini 就能生成相应的 C# 代码。

C#:.NET 应用开发的基石

有了 Gemini 生成的 C# 代码,我们就可以将其无缝集成到 .NET 应用程序中。C# 是一种强大的、类型安全的编程语言,是构建各种 .NET 应用的基石。通过将 Gemini 生成的代码集成到 C# 项目中,我们可以充分利用 .NET 平台的优势,例如强大的类型系统、丰富的类库和成熟的开发工具。此外,C# 还提供了优秀的异步编程支持,可以方便地处理与 Gemini API 的异步交互,从而提高应用程序的性能和响应能力。

REST/curl:连接AI Studio与Gemini的桥梁

AI Studio 提供的 REST/curl 代码,是连接 AI StudioGemini 的桥梁。它包含了与 Gemini API 交互所需的所有信息,例如请求的 URL、HTTP 方法、请求头和请求体。我们可以将这些信息提取出来,然后将其传递给 Gemini,让其生成相应的 C# 代码。

例如,在原文的电影推荐案例中,AI Studio 生成的 curl 命令包含了电影推荐的输入(用户喜爱的电影列表)和输出(Gemini 推荐的电影)。我们可以将这个 curl 命令作为输入,让 Gemini 生成一个 C# 函数,该函数可以将用户喜爱的电影列表作为参数传递给 Gemini API,并返回 Gemini 推荐的电影。

Prompt:指导Gemini生成高质量代码的关键

提示词(Prompt)是指导 Gemini 生成高质量 C# 代码的关键。一个好的提示词应该包含以下几个要素:

  • 明确的目标:清楚地告诉 Gemini 你希望它生成什么样的代码,例如“生成一个 C# 函数,用于与 Gemini API 交互”。
  • 详细的说明:提供尽可能详细的说明,例如“函数应接受 API 密钥和用户喜爱的电影列表作为参数”,“函数应使用 System.Net.Http.HttpClient 与 Gemini API 交互”。
  • 清晰的格式:使用清晰的格式组织提示词,例如使用 markdown 格式,并使用代码块来包含代码片段。
  • 必要的上下文:提供必要的上下文信息,例如 AI Studio 生成的 REST/curl 代码。

通过精心设计的提示词,我们可以引导 Gemini 生成高质量的、符合我们需求的 C# 代码。

代码清理和适配:确保代码的质量和可用性

即使 Gemini 生成的代码已经很不错了,但仍然需要进行一些清理和适配工作,以确保代码的质量和可用性。例如,我们需要检查代码中是否存在语法错误、逻辑错误和安全漏洞。此外,我们还需要根据实际的应用程序环境,对代码进行一些适配,例如修改配置文件的路径、调整 API 调用的参数等。

在原文的电影推荐案例中,Gemini 生成的代码使用 JsonNode 来动态修改 JSON 请求体。虽然这种方式是可行的,但可能会导致代码的可读性和可维护性降低。我们可以将其替换为更简洁的字符串替换方式,从而提高代码的质量。

实战案例:电影推荐应用

让我们通过一个实战案例来演示如何使用 AI StudioGemini 在 C# 中构建一个电影推荐应用。

步骤 1:在 AI Studio 中构建电影推荐原型

首先,我们需要在 AI Studio 中创建一个新的 Chat prompt,并配置以下信息:

  • System Instruction: “你是一个电影推荐专家。我会给你我最喜欢的电影列表,你会推荐 3 部我可能喜欢的电影,并简要解释原因。”
  • Add example turns
    • User: “我最喜欢的电影是黑客帝国、银翼杀手和星际穿越。”
    • Model: “好的,基于您对黑客帝国、银翼杀手和星际穿越的热爱,很明显您喜欢具有存在主义、技术和现实本质等强烈主题的科幻片。以下是给你的 3 个建议:1. 入侵:一部关于梦境入侵的令人费解的惊悚片。2. 机械姬:一部视觉上令人惊叹的电影,探索人工智能和意识。3. 沙丘(2021):一部具有丰富世界观的史诗般的太空歌剧。”
  • Final User Message Placeholder: “我最喜欢的电影是[INSERT_USER_MOVIES_HERE]”

步骤 2:获取 curl 代码

AI Studio 中点击 “Get Code” 按钮,然后选择 “REST” 选项卡,复制生成的 curl 命令。

步骤 3:创建转换提示词

创建一个新的 Chat prompt,并将以下提示词粘贴到编辑器中:

Create a C# function using System.Net.Http.HttpClient to interact with the Gemini API.

**Function Goal:** The function should take an API key (string) and a user's list of favorite movies (string) as parameters. It should send this information to the Gemini API and return the model's movie suggestions as a single string.

Provide the complete C# code for this function, including necessary using statements, within a single C# code block. The function should handle basic JSON serialization for the request and deserialization for the response to extract the text content.

CURL Request:
[PASTE THE CURL REQUEST BODY YOU COPIED IN STEP 2 HERE, ENSURING THE "INSERT_INPUT_HERE" PLACEHOLDER IS PRESENT IN THE LAST USER MESSAGE'S TEXT]

步骤 4:运行转换提示词

在 Chat prompt 窗口中,点击 “Run” 按钮。Gemini 将会生成相应的 C# 代码。

步骤 5:在 Visual Studio 中使用 C# 代码

创建一个新的 .NET Console Application,并将 Gemini 生成的 C# 代码粘贴到项目中。确保必要的 using 语句存在。

步骤 6:运行应用程序

运行应用程序,并输入你最喜欢的电影列表。Gemini 将会为你推荐 3 部你可能喜欢的电影。

重要注意事项

  • 参数化:将 API 密钥、模型 ID 和用户喜爱的电影列表等参数参数化,以便于配置和修改。
  • 错误处理:添加适当的错误处理代码,以处理 API 请求失败、JSON 解析错误和其他异常情况。
  • JSON 解析:使用合适的 JSON 解析库,例如 System.Text.Json,来解析 Gemini API 的响应。
  • 异步编程:使用异步编程技术,例如 asyncawait 关键字,来处理与 Gemini API 的异步交互。
  • HttpClient 生命周期:正确管理 HttpClient 的生命周期,以避免资源泄漏和性能问题。

简化代码

在原文生成的代码中,使用了 JsonNode 类来动态修改 JSON 请求体。虽然这种方式是可行的,但可能会导致代码的可读性和可维护性降低。我们可以将其替换为更简洁的字符串替换方式,如下所示:

string baseJsonPayload = @"
{
    ""contents"": [
        {
            ""role"": ""user"",
            ""parts"": [ { ""text"": ""My favorite movies are The Matrix, Blade Runner, and Interstellar."" } ]
        },
        {
            ""role"": ""model"",
            ""parts"": [ { ""text"": ""Okay, based on your love for The Matrix, Blade Runner, and Interstellar, it's clear you enjoy thought-provoking sci-fi... (full model response here)"" } ]
        },
        {
            ""role"": ""user"",
            ""parts"": [ { ""text"": ""INSERT_INPUT_HERE"" } ]
        }
    ],
    ""generationConfig"": {
        ""responseMimeType"": ""text/plain""
    }
}
";

string finalJsonBody = baseJsonPayload.Replace("\"INSERT_INPUT_HERE\"", $"\"{userMoviesList}\"");

这种方式更加简洁明了,并且可以提高代码的可读性和可维护性。

结构化输出

正如我之前的文章中所述,为了简化与应用程序其余部分的集成,你可以利用 Gemini 模型 的结构化输出能力。通过要求 模型 以特定的格式(例如 JSON)返回结果,你可以更容易地解析和使用这些结果。

总结

即使 AI Studio 的 “获取代码” 功能不断发展,并为我们提供更复杂的脚本,但提取核心 API 调用(端点、方法、标头、正文)并使用 Gemini 本身来构建 C# 客户端代码的基本原则仍然是一个非常方便的技巧。这需要现在从脚本中进行更多手动提取,但仍然比从头开始编写所有内容要好,尤其是在处理嵌套的 JSON 请求正文时。希望在不久的将来,C#也能加入AI Studio直接支持的语言列表。所以,继续在 AI Studio 中进行实验吧!不要因为 “获取代码” 输出看起来有点不同而感到沮丧。解构它,将基本要素输入到 Gemini 的新提示中,并保持 C# 集成的向前发展。

通过结合 AI Studio 的快速原型设计能力、Gemini 的代码生成能力和 C# 的强大功能,我们可以快速构建各种基于大模型的应用,从而加速我们的开发流程,并为用户带来更好的体验。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注