OpenAIのFunction Callingの詳細解析:原理、応用、および実践

  • 1798単語
  • 9分
  • 28 Jun, 2024

OpenAIのFunction Calling機能は、自然言語で事前に定義された関数を呼び出すことができる強力なツールです。この記事では、what、why、howの観点からこの機能を詳細に紹介し、実際の応用シナリオに基づいたサンプルコードとその説明を提供します。

Function Callingとは?

定義

Function Callingは、OpenAI APIの機能の一つで、開発者が自然言語の指示を通じて事前に定義された関数を呼び出せるようにするものです。これにより、複雑な操作を関数に封じ込め、簡単な自然言語でそれらの関数を呼び出すことができます。

動作原理

Function Calling機能は、OpenAIモデルの自然言語理解能力に依存しています。開発者が一連の関数を定義し、それらの関数の説明をモデルに伝えます。ユーザーが自然言語の指示を提供すると、モデルはその指示を解析し、対応する関数を呼び出します。

なぜFunction Callingを使用するのか?

複雑な操作の簡素化

Function Callingは複雑な操作を簡単な関数呼び出しに封じ込め、ユーザーが底層の実装詳細を知らなくても操作できるようにします。例えば、データベースのクエリを行う関数を定義し、自然言語の指示でその関数を呼び出すことができます。

開発効率の向上

Function Callingを使用することで、開発者はアプリケーションの構築と拡張を迅速に行えます。関数とその説明を定義するだけで、残りの作業はOpenAIモデルに任せることができます。

ユーザー体験の向上

Function Callingは、ユーザーが自然言語でアプリケーションと対話できるようにし、より直感的で親しみやすいユーザー体験を提供します。これは、チャットボットやバーチャルアシスタントの構築に特に有用です。

Function Callingの使用方法

関数の定義

まず、呼び出す関数を定義し、各関数に説明を提供します。これらの説明は、モデルが関数の用途とパラメータを理解するのに役立ちます。

functions.js
1
export function getWeather(location) {
2
// これは天気を問い合わせる関数の例です
3
return `The weather in ${location} is sunny.`;
4
}
5
6
export function getNews(topic) {
7
// これはニュースを問い合わせる関数の例です
8
return `Here are the latest news about ${topic}.`;
9
}

APIリクエストの設定

APIリクエストでは、関数の説明とユーザー入力を渡す必要があります。モデルはユーザー入力に基づいて適切な関数を呼び出します。

1
import { OpenAI } from "openai";
2
import { getWeather, getNews } from "./functions";
3
4
// OpenAI APIの設定
5
const openai = new OpenAI({
6
apiKey: process.env.OPENAI_API_KEY,
7
});
8
9
// 関数マッピングの定義
10
const functions = {
11
getWeather,
12
getNews,
13
};
14
15
// モデルの設定
16
async function callOpenAIFunction(prompt) {
17
const response = await openai.chat.completions.create({
18
model: "gpt-4-0613", // Function Callingをサポートするモデルを使用
19
messages: [
20
{ role: "system", content: "You are a helpful assistant." },
21
{ role: "user", content: prompt },
22
],
23
functions: [
24
{
25
name: "getWeather",
26
description: "特定の場所の現在の天気を取得します。",
27
parameters: {
28
type: "object",
29
properties: {
30
location: {
31
type: "string",
32
description: "天気を取得する場所の名前。",
33
},
34
},
35
required: ["location"],
36
},
37
},
38
{
39
name: "getNews",
40
description: "特定のトピックに関する最新ニュースを取得します。",
41
parameters: {
42
type: "object",
43
properties: {
44
topic: {
45
type: "string",
46
description: "ニュースを取得するトピック。",
47
},
48
},
49
required: ["topic"],
50
},
51
},
52
],
53
});
54
55
const message = response.choices[0].message;
56
57
if (message.tool_calls) {
58
for (const tool_call of message.tool_calls) {
59
const functionName = tool_call.function.name;
60
const functionToCall = functions[functionName];
61
const functionArgs = JSON.parse(tool_call.function.arguments);
62
const functionResult = functionToCall(...Object.values(functionArgs));
63
64
console.log(
65
`Function ${functionName} called with result: ${functionResult}`,
66
);
67
}
68
} else {
69
console.log(`Model response: ${message.content}`);
70
}
71
}
72
73
// サンプル呼び出し
74
callOpenAIFunction("ニューヨークの天気を教えてください。");
75
callOpenAIFunction("テクノロジーに関する最新ニュースを教えてください。");

実際の応用シナリオ

シナリオ1:スマートホームコントロール

スマートホームシステムでは、各デバイスを制御するための関数を定義し、自然言語の指示でそれらを制御できます。

functions.js
1
export function turnOnLight(room) {
2
return `Turning on the light in the ${room}.`;
3
}
4
5
export function setThermostat(temperature) {
6
return `Setting thermostat to ${temperature} degrees.`;
7
}
8
9
// OpenAI APIの設定
10
const openai = new OpenAI({
11
apiKey: process.env.OPENAI_API_KEY,
12
});
13
14
// 関数マッピングの定義
15
const functions = {
16
turnOnLight,
17
setThermostat,
18
};
19
20
// モデルの設定
21
async function callOpenAIFunction(prompt) {
22
const response = await openai.chat.completions.create({
23
model: "gpt-4-0613", // Function Callingをサポートするモデルを使用
24
messages: [
25
{ role: "system", content: "You are a helpful assistant." },
26
{ role: "user", content: prompt },
27
],
28
functions: [
29
{
30
name: "turnOnLight",
31
description: "特定の部屋のライトをオンにします。",
32
parameters: {
33
type: "object",
34
properties: {
35
room: {
36
type: "string",
37
description: "ライトをオンにする部屋の名前。",
38
},
39
},
40
required: ["room"],
41
},
42
},
43
{
44
name: "setThermostat",
45
description: "特定の温度にサーモスタットを設定します。",
46
parameters: {
47
type: "object",
48
properties: {
49
temperature: {
50
type: "number",
51
description: "サーモスタットの温度設定。",
52
},
53
},
54
required: ["temperature"],
55
},
56
},
57
],
58
});
59
60
const message = response.choices[0].message;
61
62
if (message.tool_calls) {
63
for (const tool_call of message.tool_calls) {
64
const functionName = tool_call.function.name;
65
const functionToCall = functions[functionName];
66
const functionArgs = JSON.parse(tool_call.function.arguments);
67
const functionResult = functionToCall(...Object.values(functionArgs));
68
69
console.log(
70
`Function ${functionName} called with result: ${functionResult}`,
71
);
72
}
73
} else {
74
console.log(`Model response: ${message.content}`);
75
}
76
}
77
78
// サンプル呼び出し
79
callOpenAIFunction("リビングルームのライトをオンにしてください。");
80
callOpenAIFunction("サーモスタットを22度に設定してください。");

シナリオ2:カスタマーサポート

カスタマーサポートシステムでは、よくある質問を処理するための関数を定義し、自然言語の指示でそれらを呼び出せます。

functions.js
1
export function checkOrderStatus(orderId) {
2
return `Order ${orderId} is currently being processed.`;
3
}
4
5
export function cancelOrder(orderId) {
6
return `Order ${orderId} has been cancelled.`;
7
}
8
9
// OpenAI APIの設定
10
const openai = new OpenAI({
11
apiKey: process.env.OPENAI_API_KEY,
12
});
13
14
// 関数マッピングの定義
15
const functions = {
16
checkOrderStatus,
17
cancelOrder,
18
};
19
20
// モデルの設定
21
async function callOpenAIFunction(prompt) {
22
const response = await openai.chat.completions.create({
23
model: "gpt-4-0613", // Function Callingをサポートするモデルを使用
24
messages: [
25
{ role: "system", content: "You are a helpful assistant." },
26
{ role: "user", content: prompt },
27
],
28
functions: [
29
{
30
name: "checkOrderStatus",
31
description: "注文のステータスを確認します。",
32
parameters: {
33
type: "object",
34
properties: {
35
orderId: {
36
type: "string",
37
description: "確認する注文のID。",
38
},
39
},
40
required: ["orderId"],
41
},
42
},
43
{
44
name: "cancelOrder",
45
description: "注文をキャンセルします。",
46
parameters: {
47
type: "object",
48
properties: {
49
orderId: {
50
type: "string",
51
description: "キャンセルする注文のID。",
52
},
53
},
54
required: ["orderId"],
55
},
56
},
57
],
58
});
59
60
const message = response.choices[0].message;
61
62
if (message.tool_calls) {
63
for (const tool_call of message.tool_calls) {
64
const functionName = tool_call.function.name;
65
const functionToCall = functions[functionName];
66
const functionArgs = JSON.parse(tool_call.function.arguments);
67
const functionResult = functionToCall(...Object.values(functionArgs));
68
69
console.log(
70
`Function ${functionName} called with result: ${functionResult}`,
71
);
72
}
73
} else {
74
console.log(`Model response: ${message.content}`);
75
}
76
}
77
78
// サンプル呼び出し
79
callOpenAIFunction("注文12345のステータスを確認してください。");
80
callOpenAIFunction("注文12345をキャンセルしてください。");

ベストプラクティス

  1. 明確な関数説明:各関数の説明を明確にし、モデルが関数の用途とパラメータを正確に理解できるようにします。
  2. 適切なエラーハンドリング:実際のアプリケーションでは、関数呼び出しの失敗やパラメータの不正確さなど、可能性のあるエラー状況に対処します。
  3. 継続的な最適化:ユーザーフィードバックと使用状況に基づき、関数と説明を継続的に最適化し、モデルの精度とユーザー体験を向上させます。

結論

OpenAIのFunction Calling機能は、自然言語の指示と事前に定義された関数を結び付けることで、複雑な操作を簡素化し、開発効率を向上させ、ユーザー体験を向上させます。スマートホームやカスタマーサポートなど、さまざまな応用シナリオで強力なサポートを提供します。