エセJSON
エセJSON
きょうはMachine Learning 15minutes!というイベント(ハイブリッド開催)にかなり久々に参加しました。
いろいろ刺激を受けた中、発表のひとつに「自然言語プログラミング」を試みる話があって、私が2017年から掲げていたオリジナル言語「ce-il」の思想に近いなと感じておりました。
私は今でも言語の研究開発を行っており、改めて「自然言語プログラミング」をどこまでできるか再確認したところ、ChatGPTのちょっと面白い使い方を編み出すことができました(元のアイデアは1年前の2023年4月11日に実験済)。
XMLと比べて可読性が高いといわれるJSONを、あくまでも「人が読むための文章」として使う手法です。
ちょうどWikipediaを開いたら「ラッパスイセン」の項目があったのでこちらの説明文を例として使いました。
花被片は黄色で、内側の副花冠はやや色が濃い。茎の根本から立ち上がっている葉は長細く、灰色がかった緑色を呈す。種子から育ち、発芽してから開花するまでには5年から7年を要する一方で球根からも育てることが可能である。有性生殖においては親花両方の形質が遺伝するため、園芸用の雑種が野生種の近くに植えられた場合、野生種が淘汰されてしまうおそれがあることが指摘されている
これを後述のプログラムで変換した結果(一例)を以下に示します。
{
"花被片": "黄色",
"内側の副花冠": "やや色が濃い",
"葉の特徴": {
"茎の根本から立ち上がっている": true,
"形状": "長細く",
"色": "灰色がかった緑色"
},
"育成方法": {
"種子から": {
"開花までの年数": "5年から7年"
},
"球根から": "可能"
},
"有性生殖": {
"遺伝": "両方の親花の形質",
"リスク": "園芸用の雑種が野生種を淘汰するおそれ"
}
}
どうでしょう。
言語仕様を定義せずに「JSONライク」などの簡単な指示をしているので、厳密性はなくとも「ChatGPTとのやんわりとしたお約束」で文章を返してくれます。
これは、APIの定義書通りにデータをやり取りする際には不十分な仕様なのでしょうが、ChatGPTを「API的」に使うならば、この手法で曖昧性の少ないやり取りができる可能性が見えてきます。
あくまでもご参考までに。
ソース
import OpenAI from 'openai'
const openai = new OpenAI({
organization: 'org-XXXXXXXXXXXXXXXXXXXXXXXXX',
project: 'proj_XXXXXXXXXXXXXXXXXXXXXXXX',
})
const handler = async _ => {
const stream = await openai.chat.completions.create({
model: 'gpt-4o',
messages: [
{
role: 'system',
content: 'JSONライクな日本語で出力してください。',
},
{
role: 'system',
content: 'You are API responser.',
},
{
role: 'user',
content: `花被片は黄色で、内側の副花冠はやや色が濃い。茎の根本から立ち上がっている葉は長細く、灰色がかった緑色を呈す。種子から育ち、発芽してから開花するまでには5年から7年を要する一方で球根からも育てることが可能である。有性生殖においては親花両方の形質が遺伝するため、園芸用の雑種が野生種の近くに植えられた場合、野生種が淘汰されてしまうおそれがあることが指摘されている`,
},
],
stream: true,
})
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content || '')
}
process.stdout.write('\n')
}
await handler()