シュッと TypeChat を使ってみたのだ

ちゃっす(/・ω・)/



ちょっと気になるやつがでてたので遊んでみたのだ(/・ω・)/




その名も TypeChat !!




Microsoft さんのやつですね。はい。



リポジトリの説明を DeepL 先生に翻訳してポイッ。

TypeChat

TypeChatは、型を使った自然言語インタフェースを簡単に構築できるライブラリである。

自然言語インタフェースの構築は従来困難だった。これらのアプリは、しばしば複雑な決定木に依存して意図を決定し、アクションを起こすために必要な入力を収集していた。大規模言語モデル(LLM)は、ユーザーからの自然言語入力を受け取り、意図にマッチさせることを可能にすることで、これを容易にした。これは、安全性のためにモデルの返答を制約する必要性、さらなる処理のためにモデルからの返答を構造化する必要性、モデルからの返答が有効であることを保証する必要性など、独自の課題をもたらした。プロンプトエンジニアリングはこれらの問題を解決することを目的としているが、急な学習曲線と、プロンプトのサイズが大きくなるにつれて増大する脆弱性を伴う。

TypeChatは、プロンプトエンジニアリングをスキーマエンジニアリングに置き換えます。

自然言語アプリケーションでサポートされるインテントを表す型を定義するだけです。それは、センチメントを分類するインターフェイスのような単純なものから、ショッピングカートや音楽アプリケーションの型のような複雑な例まである。たとえば、スキーマに追加のインテントを追加するには、開発者は識別されたユニオンに追加の型を追加できます。スキーマを階層化するために、開発者は「メタスキーマ」を使い、ユーザー入力に基づいて1つ以上のサブスキーマを選択することができる。

型を定義した後は、TypeChatが以下のような処理を行う:

型を使ってLLMへのプロンプトを作成します。
LLMのレスポンスがスキーマに適合しているかどうかを検証します。検証が失敗した場合は、言語モデルとのインタラクションを通じて、不適合な出力を修復します。
LLMを使わずに)インスタンスを簡潔に要約し、それがユーザーの意図に合致していることを確認する。

型があればよい!
Types are all you need!

https://github.com/microsoft/TypeChat


Types are all you need!



はい。いいですね。



で、何ができますのん?



example とかを見てもらうのが早いと思うのですが

https://github.com/microsoft/TypeChat/tree/main/examples




自然言語での入力に対してどういったレスポンスを返すかの型(スキーマ)を定義しておいてそれに基づいて答えを返す感じ(/・ω・)/



examples の input/output をいくつかのせると




感情を事前定義した感じに返してる





コーヒーをカートに追加してる




予定をカレンダー情報にまとめてる




なのでまぁ ChatGPT Function Callings みたいな感じですな( ・ω・)




ただまぁちょいと違うのはスキーマとして値を事前定義することでカチッとした値が返答に入る感じですな。(プロンプトとかで指示しなくて済む)

// The following is a schema definition for determining the sentiment of a some user input.

export interface SentimentResponse {
    sentiment: "negative" | "neutral" | "positive";  // The sentiment of the text
}



ガンダムのキャラ情報で試してみたぞ☆

というわけでガンダムキャラクターのスキーマを定義して遊んでみた



export interface GundamCharacter {
  type: 'character',
  name: string;
  gundamSeries: string;
  overview: string;
  mainMobileSuit: string;
  voiceActor: string;
  affiliation: string;
  humanType: 'ニュータイプ' | '超人' | '一般人' | 'コーディネーター' | 'Unknown';
}



> ガンダム作品に登場するアムロ・レイについて詳細に教えてください
{
  "type": "character",
  "name": "アムロ・レイ",
  "gundamSeries": "ガンダム作品",
  "overview": "詳細に教えてください",
  "mainMobileSuit": "",
  "voiceActor": "",
  "affiliation": "",
  "humanType": "Unknown"
}
Success!
> ガンダム作品に登場するシャア・アズナブルについて詳細に教えてください
{
  "type": "character",
  "name": "シャア・アズナブル",
  "gundamSeries": "ガンダム作品",
  "overview": "シャア・アズナブルはガンダムシリーズに登場するキャラクターです。",
  "mainMobileSuit": "",
  "voiceActor": "",
  "affiliation": "",
  "humanType": "Unknown"
}
Success!
> ガンダム作品に登場するガロード・ランについて教えてください
{
  "type": "character",
  "name": "ガロード・ラン",
  "gundamSeries": "ガンダム作品",
  "overview": "ガロード・ランについて教えてください",
  "mainMobileSuit": "",
  "voiceActor": "",
  "affiliation": "",
  "humanType": "Unknown"
}
Success!
> ガンダム作品に登場するヒイロ・ユイについて教えてください
{
  "type": "character",
  "name": "ヒイロ・ユイ",
  "gundamSeries": "ガンダム作品",
  "overview": "ヒイロ・ユイはガンダム作品に登場するキャラクターです。",
  "mainMobileSuit": "",
  "voiceActor": "",
  "affiliation": "",
  "humanType": "Unknown"
}
Success!
> ガンダム作品に登場するドモン・カッシュについて教えてください
{
  "type": "character",
  "name": "ドモン・カッシュ",
  "gundamSeries": "ガンダム作品",
  "overview": "ドモン・カッシュはガンダム作品に登場するキャラクターです。",
  "mainMobileSuit": "",
  "voiceActor": "",
  "affiliation": "",
  "humanType": "Unknown"
}



事前に定義しないとダメダメである 😇



全部定義すんのメンドイなーと思っていたワタクシ。



偶然いい感じになる方法を発見(/・ω・)/



スキーマにコメントで適当に情報を埋め込んでおくと、、、?

export interface GundamCharacter {
  type: 'character',
  name: string;
  gundamSeries: string;
  overview: string;
  mainMobileSuit: string;
  voiceActor: string;
  affiliation: string;
  humanType: 'ニュータイプ' | '超人' | '一般人' | 'コーディネーター' | 'Unknown';
  // '機動戦士ガンダム' | '機動戦士Vガンダム' | '機動戦士ガンダムW' | '機動武闘伝Gガンダム' | '機動戦士ガンダム逆襲のシャア' | 'Unknown';
  // 'RX-78-2 ガンダム' | 'νガンダム' | 'Zガンダム' | 'シャイニングガンダム' | 'ゴッドガンダム' | 'ヴィクトリーガンダム' | 'ウィングガンダム' | 'サザビー' | 'Unknown';
  // '緑川光' | '古谷徹' | '阪口大助' | '関智一' | '池田秀一' | 'Unknown';
  // '地球連邦軍' | 'ネオ・ジオン' | 'ジオン軍' | 'シャッフル同盟' | 'Unknown';
}
> ガンダム作品に登場するアムロ・レイについて詳細に教えてください
{
  "type": "character",
  "name": "アムロ・レイ",
  "gundamSeries": "機動戦士ガンダム",
  "overview": "ガンダムシリーズに登場する主人公の一人。地球連邦軍のパイロットであり、ニュータイプの能力を持つ。",
  "mainMobileSuit": "RX-78-2 ガンダム",
  "voiceActor": "古谷徹",
  "affiliation": "地球連邦軍",
  "humanType": "ニュータイプ"
}
Success!
> ガンダム作品に登場するシャア・アズナブルについて詳細に教えてください
{
  "type": "character",
  "name": "シャア・アズナブル",
  "gundamSeries": "機動戦士ガンダム",
  "overview": "シャア・アズナブルは、アニメ『機動戦士ガンダム』に登場するキャラクターです。彼はジオン公国のエースパイロットであり、赤い彗星として知られています。彼の目的は、ジオン公国の独立を実現することです。",
  "mainMobileSuit": "ザクII",
  "voiceActor": "古谷徹",
  "affiliation": "ジオン軍",
  "humanType": "ニュータイプ"
}
Success!
> ガンダム作品に登場するガロード・ランについて教えてください
{
  "type": "character",
  "name": "ガロード・ラン",
  "gundamSeries": "機動武闘伝Gガンダム",
  "overview": "",
  "mainMobileSuit": "",
  "voiceActor": "",
  "affiliation": "",
  "humanType": "一般人"
}
Success!
> ガンダム作品に登場するヒイロ・ユイについて教えてください
{
  "type": "character",
  "name": "ヒイロ・ユイ",
  "gundamSeries": "機動戦士ガンダムW",
  "overview": "",
  "mainMobileSuit": "",
  "voiceActor": "",
  "affiliation": "",
  "humanType": "Unknown"
}
Success!
> ガンダム作品に登場するドモン・カッシュについて教えてください
{
  "type": "character",
  "name": "ドモン・カッシュ",
  "gundamSeries": "機動武闘伝Gガンダム",
  "overview": "",
  "mainMobileSuit": "ゴッドガンダム",
  "voiceActor": "関智一",
  "affiliation": "シャッフル同盟",
  "humanType": "超人"
}



なんかいい感じに入れてくれる(/・ω・)/
(結構間違いあるけどねw)


型として指定している個所はその型にそった内容をいれて、型指定でふわっと文字列とかにしてるやつはいい感じに埋めてくれるの(/・ω・)/



内部実装見てないけど、まぁ、スキーマを読み込んでそれを基に ChatGPT とかに投げてるんでしょうなぁ。



それが図らずも Few-Shot 的になってるのかな?



という感じ。



しかしながら TypeChat は Python じゃないのと Function Callings で大体事足りるからどういう使い道があるんざんしょ?( ・ω・)




という疑問を残しておしまい。


この記事が気に入ったらサポートをしてみませんか?