
OpenAI APIで途中終了を判別し続きの生成を行う方法
はじめに
こんにちは。この記事では、OpenAIのAPIを使用して、回答が途中で生成が終了した場合の判別方法と、その続きを生成する方法について解説します。また、APIの利用にかかる料金についても説明します。
実際に、ChatGPTで言うところの「続きを生成する」ボタンをどのように実装するのかを、OpenAI APIを使用しながら詳しく解説します。

さらに、「終わりに」セクションでは、実際にOpenAI APIのレスポンスを確認できるスプレッドシートも提供していますので、ぜひ最後までお読みください。
実際に勉強できること
回答の途中終了判別:OpenAIのAPIを使用して、生成された回答が途中で終了したかどうかを判別します。
続きの生成:初回の情報取得後、続けて詳細な情報を取得する方法を解説します。
API料金の理解:OpenAI APIの利用にかかる料金について説明し、コスト管理の方法を紹介します。
この記事の対象者:
OpenAIのAPIに興味があるエンジニア:AIを使ったプロジェクトに興味があるエンジニアやデベロッパー。
チャットボットや自動応答システムの開発者:カスタマーサポートや情報提供を自動化したいと考えている開発者。
回答の途中終了を判別する方法
OpenAI APIを使用して回答を生成する際、途中で生成が終了したかどうかを判別するためのリクエストとレスポンスの例を以下に示します。
APIリクエスト
まず、APIリクエストを送信して回答を生成します。以下は、JavaScriptを使用してOpenAI APIを呼び出すサンプルコードです。
import OpenAI from "openai";
const openai = new OpenAI();
async function main() {
const completion = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages: [
{ role: "user", content: "アルベルト・アインシュタインについて教えてください" }
],
max_tokens: 50,
});
console.log(completion.choices[0]);
}
main();
APIレスポンス
以下は、APIからのレスポンスの例です。このレスポンスから、回答が途中で終了したかどうかを判別します。
{
"id": "chatcmpl-123",
"object": "chat.completion",
"created": 1677652288,
"model": "gpt-4o-mini",
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "アルベルト・アインシュタインはドイツ生まれの理論物理学者であり、相対性理論で最もよく知られています。彼の有名な方程式E=mc²は、物質とエネルギーの等価性を示しています"
},
"finish_reason": "length"
}],
"usage": {
"prompt_tokens": 9,
"completion_tokens": 50,
"total_tokens": 59
}
}
このレスポンスの中で、`choices[0].finish_reason`が"length"となっていることから、回答がトークン制限に達して途中で終了したことがわかります。
続きを生成する方法
回答が途中で終了した場合、その続きを生成するための方法について解説します。これを行うには、前回の応答を踏まえた新しいリクエストをAPIに送信します。
続きの生成リクエスト
まず、前回の回答を含む新しいリクエストを送信します。以下は、JavaScriptを使用したサンプルコードです。
import OpenAI from "openai";
const openai = new OpenAI();
async function main() {
// 初回リクエスト
const initialCompletion = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages: [
{ role: "user", content: "アルベルト・アインシュタインについて教えてください" }
],
max_tokens: 50,
});
const initialResponse = initialCompletion.choices[0].message.content;
const finishReason = initialCompletion.choices[0].finish_reason;
console.log('Initial Response:', initialResponse);
console.log('Finish Reason:', finishReason);
// 続きの生成が必要かどうかを判定
if (finishReason === 'length') {
// 続きのリクエスト
const continuationCompletion = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages: [
{ role: "user", content: "アルベルト・アインシュタインについて教えてください" },
{ role: "assistant", content: initialResponse },
],
max_tokens: 50,
});
const continuationResponse = continuationCompletion.choices[0].message.content;
console.log('Continuation Response:', continuationResponse);
}
}
main();
このコードでは、最初のリクエストの回答が途中で終了した場合に続きのリクエストを送信し、前回の応答を含めた形で新しい回答を生成しています。
API料金について
OpenAI APIを使用する際には、コストが発生します。料金は主に使用したトークン数に基づいて計算されます。ここでは、OpenAI APIの料金体系とコスト管理の方法について説明します。
料金体系
インプットトークンには以下が含まれます:
システムプロンプト: AIの挙動を設定するための初期メッセージ。
リクエストのメッセージ全体: 以前のやり取りや会話のコンテキスト、現在の質問内容を含むすべてのメッセージ。例:
[
{ role: "user", content: "アルベルト・アインシュタインについて教えてください" },
{ role: "assistant", content: "アルベルト・アインシュタインはドイツ生まれの理論物理学者であり、相対性理論で最もよく知られています。" },
{ role: "user", content: "続けて教えてください" }
]
ユーザの質問文: 現在のリクエストに含まれるユーザの質問内容。
アウトプットトークンには以下が含まれます:
アシスタントの回答: AIが生成する回答のトークン数。
また、1トークンあたりの料金はOpenAIのホームページで確認できます。
終わりに
この記事では、OpenAI APIを使用して回答が途中で終了した場合にその続きを生成する方法について解説しました。実際にこの方法を試してみるには、以下のスプレッドシートをコピーしてご利用ください。
スプレッドシートのリンク:スプレットシートをコピーする
提供できるサービス
私は、以下のようなシステム開発とコンテンツ作成を幅広くサポートしています。OpenAI APIをはじめとするさまざまな技術を活用し、お客様のニーズに合わせたソリューションを提供します。
自動化システムの構築:AIを利用したカスタマーサポート、FAQシステム、チャットボットなど、業務効率化を図るためのシステムを構築します。ニーズに応じて最適なツールや技術を組み合わせて対応します。
GPTs/Dify開発:OpenAIの技術を活用し、カスタムGPTモデルやDifyを使用したシステム開発をサポートします。
コンテンツ作成:AIを活用したコンテンツ作成を支援します。ブログ記事、マーケティング資料、教育コンテンツなど、さまざまな分野でのコンテンツを作成します。
案件のご相談はこちらから
これらの技術やサービスに興味がある方、または具体的なプロジェクトのご相談がある方は、ぜひお気軽にご連絡ください。お客様のニーズに合った最適なソリューションを提供いたします。
TwitterのDMでもお問い合わせいただけます。Twitterでの問い合わせはこちら
最後までご精読いただき、ありがとうございました。