LoginSignup
3
4

OpenAI API で C# でコマンドラインで会話する

Last updated at Posted at 2023-03-30

OpenAI API で C# でコマンドラインで会話する

open-ai_with_csharp.png

こんにちは、@studio_meowtoon です。今回は、WSL の Ubuntu 22.04 で OpenAI API を C# から使いコマンドラインから会話する方法を紹介します。

目的

Windows 11 の Linux でクラウド開発します。

こちらから記事の一覧がご覧いただけます。

実現すること

ローカル環境の Ubuntu で、OpenAI API を C# から使いコマンドラインから会話します。

C# には本来厳格なコーディング規則がありますが、この記事では可読性のために、一部規則に沿わない表記方法を使用しています。ご注意ください。

関連記事

ChatGPT API と比較してみましょう!

ChatGPT API

技術トピック

OpenAI API とは?

こちらを展開してご覧いただけます。

OpenAI API (オープンエーアイ エーピーアイ)

OpenAI API は、OpenAI が提供する自然言語処理や人工知能技術にアクセスするためのプログラムインターフェース (API) です。

特徴
この API を使用することで、開発者は OpenAI の大規模な言語モデルを利用して、文章生成、文章分類、言語翻訳、質問応答、要約などの様々な自然言語処理タスクを自動化することができます。
また、OpenAI API は複数の言語に対応しており、簡単に統合することができるため、幅広いアプリケーションで利用されています。

開発環境

  • Windows 11 Home 22H2 を使用しています。

WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。

WSL (Microsoft Store アプリ版) ※ こちらの関連記事からインストール方法をご確認いただけます

> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47

Ubuntu ※ こちらの関連記事からインストール方法をご確認いただけます

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04

.NET SDK ※ こちらの関連記事からインストール方法をご確認いただけます

$ dotnet --list-sdks
7.0.202 [/usr/share/dotnet/sdk]
$ dotnet --version
7.0.202

この記事では基本的に Ubuntu のターミナルで操作を行います。Vim を使用してコピペする方法を初めて学ぶ人のために、以下の記事で手順を紹介しています。ぜひ挑戦してみてください。

OpenAI と会話する手順

OpenAI API のキーを取得します

api_keys.png

sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

UbuntuOPENAI_API_KEY 環境変数を作成します。

$ export OPENAI_API_KEY=sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

この環境変数が一時的なものであることに注意してください。

プロジェクトの作成

.NET 環境をお持ちでない場合は、以下の関連記事から .NET SDK のインストール手順をご確認いただけます。

プロジェクトルートフォルダに移動します。
※ ~/tmp をプロジェクトルートフォルダとします。

$ cd ~/tmp

コンソールアプリを作成します。
※ OpenAIApp がアプリ名です。

$ dotnet new console -o OpenAIApp -f net7.0

コンソールアプリをビルド・実行します。

$ cd ~/tmp/OpenAIApp
$ dotnet run
Hello, World!

ここまでの手順で、C#.NET コンソールアプリが作成できました。

ライブラリの追加

OpenAI のパッケージを NuGet で取得します。

$ dotnet add package OpenAI

パッケージを確認します。

$ dotnet list package
プロジェクト 'OpenAIApp' に次のパッケージ参照が含まれています
   [net7.0]:
   最上位レベル パッケージ      要求済み    解決済み
   > OpenAI          1.6.0   1.6.0

ここまでの手順で、プロジェクトに OpenAI のパッケージを組み込むことができました。

コードの修正 その1

OpenAI API で会話します。

Program.cs を修正します。

$ vim Program.cs

ファイルの内容

Program.cs
using static System.Console;
using static System.Environment;
using OpenAI_API;
namespace OpenAIApp {
    class Program {
        static async Task Main(string[] args) {
            // get an api key.
            string? apiKey = GetEnvironmentVariable("OPENAI_API_KEY");
            // create an api object.
            OpenAIAPI api = new(apiKey);
            // read a prompt from the console.
            WriteLine("Enter a prompt: ");
            string? prompt = ReadLine();
            // get a result from the api.
            string? result = await api.Completions.GetCompletion(prompt);
            WriteLine(result.Trim());
            // wait the console.
            ReadLine();
        }
    }
}

コンソールアプリをビルド・実行します。

$ dotnet run
Enter a prompt:
Are you human?
No, I am not human.

ここまでの手順で、OpenAI API を使い OpenAI と会話することができました。

しかし、現在のプログラムでは会話は一回きりで終了してしまいます。

コードの修正 その2

プログラムを停止するまで会話を繰り返します。

Program.cs を修正します。

$ vim Program.cs

ファイルの内容

Program.cs
using static System.Console;
using static System.Environment;
using OpenAI_API;
namespace OpenAIApp {
    class Program {
        static async Task Main(string[] args) {
            // get an api key.
            string? apiKey = GetEnvironmentVariable("OPENAI_API_KEY");
            // create an api object.
            OpenAIAPI api = new(apiKey);
            // loop until a prompt is empty.
            string? prompt = null;
            do {
                // read a prompt from the console.
                WriteLine("Enter a prompt (or press Ctrl + C to exit):");
                prompt = ReadLine();
                if (!string.IsNullOrEmpty(prompt)) {
                    // get a result from the api.
                    string? result = await api.Completions.GetCompletion(prompt);
                    // print the result.
                    WriteLine(result.Trim());
                }
            } while (!string.IsNullOrEmpty(prompt));
            // wait the console.
            ReadLine();
        }
    }
}

コンソールアプリをビルド・実行します。

$ dotnet run
Enter a prompt (or press Ctrl + C to exit):
How are you?
I'm doing well, thank you for asking. How about you?
Enter a prompt (or press Ctrl + C to exit):
I'm fine. are you?
Yes, I'm doing well, thanks.
Enter a prompt (or press Ctrl + C to exit):

ここまでの手順で、OpenAI API を使い OpenAI会話のラリーを行うことができました。

しかし、現在のプログラムでは自分の会話と OpenAI の会話の表示が分かりづらいです。

コードの修正 その3

コンソール出力を付けます。

Program.cs を修正します。

$ vim Program.cs

ファイルの内容

Program.cs
using static System.Console;
using static System.ConsoleColor;
using static System.Environment;
using OpenAI_API;
namespace OpenAIApp {
    class Program {
        static async Task Main(string[] args) {
            // get an api key.
            string? apiKey = GetEnvironmentVariable("OPENAI_API_KEY");
            // create an api object.
            OpenAIAPI api = new(apiKey);
            // loop until a prompt is empty.
            string? prompt = null;
            do {
                // read a prompt from the console.
                ForegroundColor = Yellow;
                WriteLine("Enter a prompt (or press Ctrl + C to exit):");
                ResetColor();
                prompt = ReadLine();
                if (!string.IsNullOrEmpty(prompt)) {
                    // get a result from the api.
                    string? result = await api.Completions.GetCompletion(prompt);
                    // print the result.
                    ForegroundColor = Green;
                    WriteLine(result.Trim());
                }
            } while (!string.IsNullOrEmpty(prompt));
            // wait the console.
            ReadLine();
        }
    }
}

コンソールアプリをビルド・実行します。

$ dotnet run

image.png

ここまでの手順で、OpenAI API を使い OpenAI と会話を楽しむプログラムを作成することができました。

まとめ

ローカル環境の Ubuntu で、OpenAI API を C# から使いコマンドラインから会話することができました。

実際の開発では、軽量なテキストエディタである VS Code や、IDE (統合開発環境) を使用して、.NET プログラムを開発することが一般的です。しかし、dotnet コマンドでビルドしたり、実行したりすることも、.NET 開発環境を理解する上で役立ちます。

どうでしたか? Window 11 の WSL Ubuntu に、.NET の開発環境を手軽に構築することができます。ぜひお試しください。今後も .NET の開発環境などを紹介していきますので、ぜひお楽しみにしてください。

参考資料

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4