投稿

#25 PHPで学ぶAI API(ChatGPT等)の呼び出し方の基本

ChatGPTのようなAI(人工知能)が回答を生成してくれる仕組みを、自分のプログラムから呼び出せたら便利だと思いませんか。実はそれほど難しいことではなく、PHPからでも数十行のコードでAI API(AIの機能をインターネット経由で使えるようにした窓口)を呼び出すことができます。この記事では、PHPを使ってAI APIにアクセスする基本の流れを、初めての方にもわかるように解説します。 AI APIとは何か API(Application Programming Interface)とは、あるプログラムが別のプログラムの機能を呼び出すための「窓口」のようなものです。AI APIは、ChatGPTのような対話型AIの機能を、インターネット経由でリクエスト(依頼)を送ることで使えるようにしたサービスです。自分のパソコンでAIモデルを動かす必要はなく、質問文を送るとAIが考えた回答が返ってくる、という仕組みになっています。 PHPからAI APIを呼び出す準備 APIキーとは AI APIを使うには、多くの場合「APIキー」と呼ばれる文字列が必要です。これは、誰がどれだけAPIを使ったかを識別するための、いわば「合言葉」のようなものです。AIサービスの提供元(例えばOpenAI社)のサイトでアカウントを作成すると、このAPIキーを発行してもらえます。 APIキーの安全な管理方法 APIキーはパスワードと同じくらい大切な情報です。もし他人に知られてしまうと、勝手にAPIを使われて利用料金が発生してしまう恐れがあります。そのため、APIキーをソースコードの中に直接書き込むのは避けましょう。代わりに、環境変数(プログラムの外側で管理する設定値)や、Gitの管理対象から外した .env ファイルに保存し、プログラムから読み込む方法が一般的です。もしGitHubなどにコードを公開する場合は、 .gitignore ファイルに .env を必ず追加しておきましょう。 cURLで実際に呼び出してみる PHPには「cURL」という、外部のWebサービスと通信するための仕組みが標準で備わっています。ここでは、OpenAIのAPIを例に、簡単な質問を送って回答を受け取るコードを見てみましょう。 <?php // APIキーは環境変数から読み込む(直接書き込ま...

#25 Scalaで学ぶAI API(ChatGPT等)の呼び出し方の基本

#25 Scalaで学ぶAI API(ChatGPT等)の呼び出し方の基本 ChatGPTのようなAI(人工知能)が返す文章を、自分のプログラムから使ってみたいと思ったことはありませんか。実はこうしたAIの多くは「API」という仕組みを通じて、誰でもプログラムから呼び出せるようになっています。今回はScalaという言語を使って、AI APIを呼び出す基本のやり方を見ていきましょう。 AI APIとは何か API(エーピーアイ)とは「Application Programming Interface」の略です。あるソフトウェアの機能を、別のプログラムから使えるようにするための窓口のようなものです。ChatGPTなどのAIサービスは、インターネット経由でリクエスト(依頼)を送ると、AIが考えた答えをレスポンス(返答)として返してくれるAPIを公開しています。 このやり取りは多くの場合「REST API」と呼ばれる形式で行われます。難しく聞こえますが、要するに「決まった形のURLに、決まった形のデータを送ると、決まった形のデータが返ってくる」というシンプルな約束事だと考えれば大丈夫です。データのやり取りには「JSON」というテキスト形式がよく使われます。JSONは`{"key": "value"}`のように、名前と値をペアで書く、人にも読みやすいデータの書き方です。 ScalaでHTTP通信をするには ScalaはJava仮想マシン(JVM)上で動く言語で、Javaの豊富なライブラリ(便利な部品集)がそのまま使える点が特徴です。ただ、素のJavaのHTTP通信の書き方はやや冗長なので、Scala向けのHTTPクライアントライブラリを使うのが一般的です。代表的なものに「sttp」というライブラリがあります。 sttpを使うと、次のようなイメージでリクエストを組み立てられます。 import sttp.client3._ val request = basicRequest .header("Authorization", s"Bearer $apiKey") .header("Content-Type", "applicat...

#25 Dartで学ぶAI API(ChatGPT等)の呼び出し方の基本

ChatGPTのようなAI(人工知能)が提供する「API」を、自分のプログラムから呼び出してみたいと思ったことはありませんか。APIとは「Application Programming Interface」の略で、あるサービスが持つ機能を、外部のプログラムから使えるようにする窓口のことです。今回は、Googleが開発したプログラミング言語「Dart」を使って、AI APIを呼び出す基本の流れを見ていきます。Dartは主にスマートフォンアプリ開発フレームワーク「Flutter」で使われる言語ですが、単体のプログラムとしても動かせます。 AI APIを呼び出すとはどういうことか ChatGPTなどのAIサービスの多くは、「HTTPリクエスト」という仕組みでやり取りできる窓口(API)を用意しています。HTTPリクエストとは、インターネット上のサーバーに対して「このデータをください」「この内容を処理してください」とお願いする通信の形式です。私たちがブラウザでWebページを見るときも、裏側では同じ仕組みが使われています。 AI APIの場合、こちらから「こんな質問をします」という文章(プロンプトと呼びます)をサーバーに送ります。すると、AIが考えた返事がデータとして返ってくる、という流れになります。つまり、プログラムからAPIを呼び出すというのは、この「送って、受け取る」という一連の通信処理をコードで書くことに他なりません。 Dartでの基本の書き方 Dartには標準で dart:io というHTTP通信用のライブラリが含まれています。ただし実務では、もう少し使いやすい http という外部パッケージ(他の人が作って公開している便利な部品集)を使うのが一般的です。パッケージは pubspec.yaml というファイルに依存関係として書き加え、 dart pub get コマンドで取り込みます。 実際にAPIを呼び出すコードのイメージは、次のようになります。 import 'dart:convert'; import 'package:http/http.dart' as http; Future<void> askAI(String question) async { final url = Uri.par...

#20 TypeScriptで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

TypeScriptで関数を書いていると、「引数を渡さなかったときは決まった値を使いたい」「いくつ渡されるか分からない引数を受け取りたい」という場面によく出会います。今回はそんなときに役立つ「デフォルト引数」と「可変長引数(レスト引数)」という2つの機能を紹介します。どちらも、関数をより柔軟で使いやすくするための仕組みです。 デフォルト引数とは 「デフォルト引数」とは、関数を呼び出すときに引数を省略した場合に、あらかじめ決めておいた値(初期値)を自動的に使ってくれる仕組みです。呼び出し側が毎回すべての引数を指定しなくてもよくなるので、関数を使う側の手間が減ります。 書き方はとてもシンプルで、引数の後ろに = 初期値 を付けるだけです。 function greet(name: string, greeting: string = "こんにちは"): string { return `${greeting}、${name}さん!`; } console.log(greet("田中")); // こんにちは、田中さん! console.log(greet("鈴木", "おはよう")); // おはよう、鈴木さん! 上の例では、 greeting に値を渡さなければ自動的に「こんにちは」が使われます。JavaScriptにも同じ書き方のデフォルト引数はありますが、TypeScriptでは型注釈と組み合わせられる点がポイントです。型注釈とは、その変数がどんな種類のデータかを示すラベルのようなものです。 greeting: string = "こんにちは" のように書いておけば、「greetingは文字列型で、省略時は"こんにちは"になる」という情報がコード上ではっきりします。 なお、デフォルト引数は必ず引数リストの後ろの方に置くのが基本です。省略できない引数を先に、省略可能な引数を後にする順番を意識すると、呼び出し側も迷いにくくなります。 可変長引数(レスト引数)とは 「可変長引数」とは、いくつ渡されるか事前にわからない数の引数を、まとめて1つの配列として受け取る仕組みです。TypeScript(JavaSc...

#20 Rustで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

はじめに PythonやJavaScriptで関数を書いていると、「引数を省略したら自動でデフォルトの値が使われる」機能や、「引数の数を自由に増やせる」機能を使ったことがある人は多いと思います。たとえばPythonなら def greet(name, greeting="こんにちは") のように、引数に最初から値を入れておく「デフォルト引数」が書けます。また、 def total(*numbers) のように、いくつでも数値を渡せる「可変長引数」も気軽に書けます。 ところが、Rustにはこの2つの機能が言語として用意されていません。最初は「不便だな」と感じるかもしれませんが、Rustには代わりの書き方がいくつも用意されています。今回は、Rustで「デフォルト引数っぽいこと」「可変長引数っぽいこと」を実現する方法を、初心者向けにやさしく紹介します。 なぜRustにはデフォルト引数がないのか Rustは「関数のシグネチャ(引数の型や数などの定義)を見ただけで、呼び出し方を誤解なく判断できる」ことを重視している言語です。デフォルト引数を許すと、呼び出す側がどの引数を省略したのか読み取りにくくなる場合があるため、あえて言語機能として採用していません。その代わり、次のような書き方で似たことを実現できます。 方法1: Option型を使う Option型 とは、「値があるかもしれないし、ないかもしれない」ことを表すRust特有の型です。値がある場合は Some(値) 、ない場合は None という形で表現します。これを引数に使うと、「省略したい場合はNoneを渡す」という形でデフォルト引数のような動きを再現できます。 fn greet(name: &str, greeting: Option<&str>) { let greeting = greeting.unwrap_or("こんにちは"); println!("{}、{}さん", greeting, name); } fn main() { greet("太郎", None); // こんにちは、太郎さん greet("花子...

#20 Goで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

Pythonを触ったことがある人なら、関数を定義するときに「引数を省略したらこの値を使う」というデフォルト引数を書いた経験があるかもしれません。ところが、Goで同じ書き方をしようとすると、そんな構文はどこにもないことに気づきます。今回は、Goに「デフォルト引数」がない理由と、その代わりにどう書けばよいのかを紹介します。あわせて、渡す個数を自由に変えられる「可変長引数」についても解説します。 Goにはデフォルト引数がない PythonやJavaScript、C++などでは、関数の引数に初期値をあらかじめ設定しておく「デフォルト引数」という仕組みがあります。呼び出し側が値を渡さなければ、その初期値が自動的に使われる、というものです。 ところがGoの設計方針は「言語仕様をできるだけシンプルに保つ」ことを重視しており、デフォルト引数の構文はあえて用意されていません。同じように、同じ関数名で引数の型や数が違うバージョンを複数定義できる「関数オーバーロード」もGoには存在しません。慣れないうちは不便に感じるかもしれませんが、これはGoが「関数を読んだときに、何が起きるか一目でわかること」を大事にしているためです。 可変長引数(...構文)の使い方 デフォルト引数はありませんが、「引数の個数を呼び出し側が自由に決められる」可変長引数はGoにもちゃんと用意されています。型の前に ... を付けるだけです。 func sum(nums ...int) int { total := 0 for _, n := range nums { total += n } return total } func main() { fmt.Println(sum()) // 0 fmt.Println(sum(1, 2)) // 3 fmt.Println(sum(1, 2, 3)) // 6 } 関数の中では、 nums はint型のスライス(可変長の配列のようなもの)として扱われます。引数を1つも渡さなければ空のスライスになるため、上のように sum() を呼んでもエラーにはなりません。標準ライブラリの fmt.Println も、実はこの可変長引数を使って実装されています。 すで...

#20 Javaで学ぶ関数の応用(デフォルト引数・可変長引数)の基本

「関数(メソッド)に、状況に応じて渡す引数の数を変えたい」——そんな場面に出会ったことはありませんか。たとえば「割引率を指定しなかったら0%として計算する」とか、「数値をいくつでも渡せる合計関数を作りたい」といった要望です。 Python など一部の言語には、こうした要望に応える「デフォルト引数」という仕組みが標準で用意されています。関数を定義するときに引数の初期値をあらかじめ決めておき、呼び出し側で省略できるようにする機能です。しかし、Javaにはこのデフォルト引数という言語仕様が存在しません。今回は、Javaがその代わりにどんな方法で同じような柔軟さを実現しているのかを見ていきましょう。 Javaにデフォルト引数がない理由と代替手段 まず前提として、Javaの設計方針では「引数の数や型によって呼び出し方を明確に区別する」ことが重視されています。デフォルト引数のような「省略できる引数」を許すと、コードを読む人が「実際に何が渡されているのか」を把握しにくくなります。そう考えられているためです。良し悪しというより、言語ごとの設計思想の違いだと捉えておくとよいでしょう。 では、Javaで「引数を省略したような呼び出し」をしたい場合はどうするのか。答えは「メソッドのオーバーロード(overload)」です。オーバーロードとは、同じ名前のメソッドを、引数の数や型を変えて複数定義できる仕組みのことです。呼び出し側が渡した引数の内容に応じて、コンパイラが自動的にどのメソッドを使うかを判断してくれます。 オーバーロードの具体例 たとえば「割引率を指定しない場合は0%として計算する」処理は、以下のように2つのメソッドを用意することで実現できます。 public class Shop { // 割引率を指定するバージョン static int calcPrice(int price, double discountRate) { return (int) (price * (1 - discountRate)); } // 割引率を省略した場合のバージョン(0%扱い) static int calcPrice(int price) { return calcPrice(price, ...