3 ポイント 投稿者 GN⁺ 2023-07-21 | 2件のコメント | WhatsAppで共有
  • 既存アプリに自然言語入力を組み込む際の最大の難しさは、ユーザーの意図をソフトウェアが信頼できる構造に変換することであり、TypeChat はこの点を TypeScript の型で解決しようとするライブラリ
  • LLM の自由形式のテキスト応答はパースが不安定なため、TypeChat は応答を JSON に誘導し、スキーマ検証を組み合わせてアプリが処理可能なデータにする
  • TypeScript の型は JSON 構造を精密に表現でき、LLM が学習過程で多く接してきた形式でもあるため、応答スキーマとして活用しやすい
  • 応答が型と一致しない場合は、TypeScript コンパイラのエラーを再びフィードバックして修正できるため、後処理やユーザー確認の前に 型安全性 を高められる
  • TypeChat は npm install typechat でインストールでき、MIT ライセンスのオープンソースとして公開されており、OpenAI API と Azure OpenAI サービスの統合も提供する

自然言語の要求をアプリが処理できるデータに変換する

  • 最新の大規模言語モデルはチャットアシスタントには簡単に組み込めるが、既存アプリのインターフェースに自然言語を安定して統合することは別の課題である
  • TypeChat はユーザーの要求をアプリが処理できる形に変換し、開発者とユーザーの双方が信頼できる動作を実現することに焦点を当てている
  • 公開されたライブラリはコードベースの 型定義 を使って構造化された AI 応答を取得し、型安全性を目指す
  • インストールは次のコマンドで可能
npm install typechat

自然言語のパースではなく JSON と型を使う

  • LLM は基本的に英語のような 自然言語 の会話向けに最適化されているため、「箇条書きで答えよ」のようなルールをプロンプトに入れても、一般的なソフトウェアが安定してパースするのは難しい
  • JSON で答えるよう求めれば、概ねアプリが扱いやすい形の応答を生成できる
    • 例では、「blueberry muffin」1 個と「grande latte」1 杯の注文が、items 配列を持つ JSON に変換される
  • 単純な例は構造を誘導する助けにはなるが、AI が何を返すべきかを十分に定義できず、検証基準も提供できない

TypeScript の型を応答スキーマとして使う

  • TypeChat は TypeScript の型 をプロンプトに含め、LLM が返すべき JSON 構造を案内する
  • 例示スキーマの Response 型には items: Item[] が含まれ、Itemnamequantity、任意の sizenotes フィールドを持つ
  • TypeScript は JSON を精密に記述するのに適しており、LLM が多くの型定義に触れてきたため、応答形式を誘導するのに有用である
  • 応答が型に一致しない場合は、有効な TypeScript コードである型定義を基準に TypeScript コンパイラ が検証する
  • コンパイラのエラーフィードバックは応答の修正を促すために活用され、型に合った応答を得る流れをより堅牢にする

TypeChat の使い方と例

  • TypeChat はユーザーの意図を構造化された応答へ変換する データスキーマ 方式に利用できる
  • 例のコードでは、ユーザー入力文の感情を negativeneutralpositive のいずれかに判定する SentimentResponse インターフェースを定義している
  • createLanguageModel(process.env) で環境変数ベースの言語モデルを作成し、スキーマファイルを読み込んだ後、createJsonTranslator<SentimentResponse> でトランスレータを生成する
  • translator.translate(request) が成功すれば response.data.sentiment を出力し、失敗すればエラーメッセージを出力する
  • データスキーマに加えて、API スキーマ を使って基本的なプログラムを構成することもできる
  • 使い方は docsexamples で確認できる

オープンソースとモデル中立性

  • TypeChat は MIT ライセンス のオープンソースであり、GitHub で公開されている
  • 利便性のため、OpenAI API と Azure OpenAI サービス向けの基本統合を提供している
  • 設計目標は モデル中立性 であり、チャット補完スタイル API であれば利用できるアプローチを志向している
  • 現在は、散文とコードの両方で学習されたモデルで TypeChat が最もよく機能する
  • パッケージは npm に公開されており、すぐに試すことができる

2件のコメント

 
sungwoo 2023-07-26

笑、ニュースを見て投稿しようと思ったのに、AIにはかなわないね

 
GN⁺ 2023-07-21
Hacker Newsの意見
  • ここにどんな付加価値があるのか、いまいち分からない
    LLMに送る中核メッセージはここにある: https://github.com/microsoft/TypeChat/blob/main/src/typechat...
    結局のところ、固定プロンプトで構造化データを返させ、少しの自動化とベンダーロックインを載せた形に見える。こうしたLLMライブラリの大半は下位APIを包んだ雑なAPIに近く、同じことをするスクリプトは簡単に作れるし、モデルやユーザー要件が変わるほどその方が柔軟だ
    たとえばプロンプトを変えたりPythonクラスを使ったりしたいなら、こうしたライブラリと、API呼び出し・テキストテンプレートをユーザー側に押し上げる方式(https://github.com/hofstadter-io/hof/blob/_dev/flow/chat/llm...)との間には作業量の差が大きい

    • 価値はここにある: 1) LLMが返した結果にTypeScript型チェッカーをかける、2) 型エラーがあればそれを集めて「修正プロンプト」にし、型チェックを通る可能性が高い出力を誘導する、3) 2のヒューリスティックが失敗するケースもきれいに処理する
      https://github.com/microsoft/TypeChat/blob/main/src/typechat...
      同じアイデアを試した経験からすると、2のヒューリスティックは比較的単純な型、つまり深くネストしていないレコードや配列、限定的な型変数の使用では驚くほどよく機能する。LLMに比較的単純な型の値を返すようプロンプトするだけでも有用なアプリケーションは作れるし、このライブラリにはそのリクエストパターンを自前で実装する必要を減らし、TypeScriptコードベースとの標準的な統合を提供するという価値がある
    • 最近見かけるLLMライブラリはほとんど全部こういう感じだ。結局はLLMに何かを特定のやり方でやってくれと頼む形に帰着し、複雑な条件では指示に従わなくなってデフォルト動作に戻るのを見てきた
      それでもライブラリを使う方向が正しい気はするので、どのアプローチが十分成熟するかを引き続き見守っている
    • どこにベンダーロックインがあるのか分からない。これはオープンソースライブラリだし、リンク先のファイルにもChatGPTとBardの2つのベンダー設定が入っている
    • 価値は非構造化データを構造化データに変え、スキーマ制約を満たすことを保証する点にある
      たとえば製品についての自由記述アンケート回答が1000件あるなら、スキーマを作ってそれぞれにTypeChatを走らせれば、その自由記述に対するデータセットを得られる。ものすごく有用だ
    • 抽象化が良くなるほど、有用なものをコーディングしやすくなる
  • 理解できない点が1つある
    有効な応答が来ることを願い、最後の段階でバリデーターを付けて誤った応答を検知し、モデルにどうか望む文法で答えてくれと頼むような複雑な手順を、なぜ踏むのか分からない
    要求した形式に合うトークンだけをサンプリングすれば、有効なJSON文法を保証できる。毎回スコアが最も高いトークンを貪欲に選ぶ代わりに、要求形式に合致するトークンの中で最もスコアが高いものを選べばいい
    MicrosoftのGuidanceはすでにこうしている: https://github.com/microsoft/guidance
    ただ、OpenAIは全トークンの完全なスコアは公開せず、最高スコアのトークンだけを公開しているようだ。ローカルでモデルを回すならGuidanceを使うのは簡単で、JSONが毎回正しいことを保証できるし、生成もより速いのに不思議だ

    • 茶色のM&Mの話[0]に似ている。モデルが意味的に正しいデータを返すなら、少なくとも文法は合わせられると期待できる。それができないなら、どうせ応答は捨てるしかない
      それに、そのやり方ではTypeScript型の複雑さ全体を表現するのは難しそうだ
      [0] https://www.snopes.com/fact-check/brown-out/
    • そのやり方で文法的に正しいJSONは保証できても、意味的に正しいかは別問題だ
      モデルが本当は別のトークンを入れたがっているのに、無理やり{を入れさせると、その後に生成されるテキストの品質が落ちるかもしれない。確信はなく、ただ思いつきとして言っているだけだ
    • 有効なトークンだけをサンプリングする方式は非常に有望だと思う
      オープンソースLLMをJSONパース用にファインチューニングしたことがあるが、誘導トークンサンプリングなしでも用途によっては70Bパラメータは過剰かもしれない。もっと小さなモデルでもかなり良い結果を見たし、小型モデルのファインチューニングと誘導トークンサンプリングを組み合わせると面白そうだ
      ただし、非常に汎用的なアプリケーションにはファインチューニングが完全ではないかもしれない。学習データセットで想定していない入力が来ると困る
    • LLMはもっと複雑なシナリオを処理できる。たとえば無人販売機で注文の全手順を踏まずにそのまま注文を言えば、「チョコレートバーをいくつか」のような表現を在庫と照らして推測できる
      もちろんWebでは話にならない。マウスでいくつかの商品をクリックする方がずっと簡単だ
    • Llama.cppが最近説明したように、固定された形式に従うようトークン選択を制約する文法ベースのサンプリングを追加した
      https://github.com/ggerganov/llama.cpp/pull/1773
  • 何かを思いつくと、Anders Hejlsberg がもう作ってしまっている気がする
    構造化されたリクエストとレスポンスは、LLM の次の進化として 100% 正しい。人々はすでにチャットボットに飽きつつあるし、テキスト解析やプロンプトの心配なしに、どんなバックエンドでも接続できるようになればすごいことになる

    • ローカルで動く LLM に、自分が提供する実行可能なインターフェースをつなげたい。たとえば「時間を確認する」「カレンダーを確認する」「ユーザーにメッセージを送る」といったものだ
      TypeChat は正しい方向に進んでいるように見える。「この JSON 入力を、可能なら利用可能なアクションのどれかに合わせろ」といった追加レイヤーも想像できる
      ボット、つまり LLM などが実際のコード層をつなぎ合わせる、すっきりしたハイブリッドな未来が見える。あるときは収集・タグ付けの一部になり、あるときは入力に応答する一部になる、といった具合だ
      全体として非常に興味深い分野だが、すべての動きが速すぎて、まだ深く掘り下げてはいない。賢い人たちがたくさん取り組んでいるので、少し落ち着くのを待つ必要があると感じる。それでも、自分が夢見ていたホームインターフェースは、もう作れる段階に来ている気がする
    • 昨日ちょうど似たようなものを実装したが、オブジェクトより関数中心に重点を置いた
    • バックエンド層の動的マッパーとして使えば、とてつもないものになるかもしれない
      たとえば Java コンシューマーの周辺で頻繁に変わる API ペイロードを追ってみるといい。銀行業界、巨大な JSON ペイロード、Java バックエンド環境の中で正気を保つために、別途 NodeJS 層を作った
      マッピングは、LLM が真価を発揮できる分野だ
    • 見る価値あり: https://news.ycombinator.com/item?id=36750083
  • 熱い見方をするなら、私たちは徐々に AI の道具化段階に入っている。ここでは実際の価値創出はあまりないと人々が気づきつつあるが、AI にあまりにも多くの資金が投じられているので、引き続きお金が流れ込んでいる。学術論文を書くにも都合のいいテーマで、LangChain はほとんど冗談のようなものなのにシードで 1000 万ドルを調達した
    DeFi/crypto は 2 年前にこの段階を通った。数年間、奇妙なリムボ状態が続いたあと、AI は製品ではなく機能であり、適用範囲は限定的で、世界を救うものではないと人々はゆっくり気づくだろう。あらゆるエッジケースのせいで自動運転車は実現できず、人を殺しかねないので手術にも使えないだろう
    Copilot のような最も有用な AI ツールでさえ、せいぜい周辺的に役立つ程度だと私はずっと言ってきた。よくても Google で何度かクリックする手間を減らすだけで、エージェントはまったく「知的」ではない。数年前にはチャットボット[1]でも似たようなバブルがあり、今では誰も気にしていない。「メタバース」はもっと短命だったが、同じ群集心理が働いていた。「次の本命」だともてはやされて、そうではないとわかる、という流れだ
    [1] https://venturebeat.com/business/facebook-opens-its-messenger...

    • AI が適用範囲の限られたバブルにすぎないという話には強く反対する
      自動運転車や手術のような、AI における最も難しい適用例だけを持ち出している。大多数の人の仕事は生死に関わるものではないので、自動化に非常に向いている。生死に関わる職業に人間の要素が残るとしても、AI エージェントで補強される可能性は高い。たとえば手術は人間が行うとしても、医師や看護師が AI と一緒に診断することが義務になるかもしれない
      数年前のチャットボットバブルと今を本気で比較しているのか? ChatGPT は数か月でユーザー 1 億人に到達し、本当に多くの人が使ってみた。数年前のチャットボットバブルは、そこまでの存在感はまったくなかった
      Copilot などが周辺的にしか役立たないというのは、今見ているのが最悪のバージョンだからだ。ChatGPT は私の人生を変えたし、まだコード実行すらしていない。Code Interpreter はそれをするが、まだ試していない
      2030 年ごろには、人間はおそらくもうコードをタイピングせず、機械にプロンプトを与えて AI エージェントを指揮するようになっているだろう。そのころには、ほとんどの仕事も自動化されている可能性が高い
      AI は単なる流行ではなく、あらゆる産業を変える。そしてその変化は、人々が思っているよりはるかに速い。メタバースと比べて AI の含意を矮小化する冷笑は不合理で想像力に欠ける。特に AI エージェントの面では、やるべきことがまだ多いのは確かだが、私たちはおそらく人々が考えるよりずっと早くそこに到達し、その波及効果は巨大だ
    • ChatGPT を使うたびに、ほかの人たちが見ているものとは別の技術を見ているように感じる。あらゆる質問に答え、何でも教えてくれると言われるが、実際にはコンテンツファームのサービスのように感じる。Copilot も同じようなもので、たいていは悪い例の中からまだマシなものを探してバグを直すより、自分でコードを書いたほうが簡単だ
      ただし AlphaGo は、悪手を「幻覚」していた状態から世界最高の棋士になるまで、そう長くはかからなかった。言語モデルでもこれが可能なら、GPT-x が今の議論をすべて吹き飛ばしてしまうかもしれない
    • 「実際の価値創出がない」という言い方には強く反対する。私のユースケースには非常に明確な反例がある
      GPT-4 は、熟練者が自分の技能はおおむね通用するものの、ドメイン知識が弱い周辺作業をこなすときに非常に役立つ
      私は 10 年間コードを書いてきて、最近初めて機械学習を学んでいるところだが、毎日 GPT-4 を使っていて、とても満足している
      もちろん粗い部分が時々気になることはある。私にとっては対処可能なレベルで、大きな負担ではない。無視したり回避したりすることにも慣れたし、こうしたツールを使うには確かに技術が要る
      提供される価値は今後も増え続けると思う。まだ低い位置の果実も中くらいの高さの果実も、取り尽くされてはいない
    • DeFi/crypto との本質的な違いは、あちらは技術的にどれほど印象的でも、人々が最初の利益を得るために、それまでやっていたことを完全に変えなければならなかった点にある
      現代の AI、実際にはたいてい LLM は、ほぼすべての経済部門に即座に幅広く適用できる。だからこそ、すでに多くの人が機能を作って公開している。この技術には非常に大きな価値がある。世界を完全に変えるかといえばそうではないが、新しい製品カテゴリを生み出し、既存製品の能力の大きな部分を根本的に改善するには十分だ
    • かなり妥当な見方だと思う。AI には用途が多く、ある種の仕事には本当に優れているが、人々が期待するような万能の解決策ではない
  • Apple、Google、Amazon、Microsoftの音声アシスタントのうち、なぜまだLLMをサービスに統合したものがなく、OpenAIはなぜ独自の音声アシスタントを出していないのかが分からない。
    また、RSSのようにWebサイトがAI対話用の標準URLを公開し、TypeChatでインターフェースを公開すれば、かなりそこへ近づける気がする

    • OpenAIは独自のアシスタントを作る可能性が高い。Karpathyの「Building a kind of JARVIS @ OреոΑӏ」を見るとそう思うし、Microsoftも当然、OpenAIのLLMでCortanaを統合または再解釈する作業をしているはず。
      ただし、音声ベースのLLMよりも、実際に行動を実行する能力の価値のほうがはるかに大きい。Alexaを例にすると、スマートホーム制御を予測可能でデバッグ可能な形で処理するシステムが必要になる。でないと人は苛立つ。
      間違いなく可能だとは思うが、現在のAlexaやSiri、あまり使われないCortanaのようなシステムは、何年も前のより非力なモデルの上に、さまざまなフックやAPIを使うルールやソフトウェアを積み重ねている。動くようにするには、現在の品質を保ったまま改善しつつ、同時にシステムの主要部分を作り直さなければならないので、時間がかかる。
      しかも、こうしたアシスタントは実際には利益を生まず、たいてい赤字になる。スマートフォンやショッピングなど別の形で収益化したり事業を押し進めたりできる大企業にしか価値がなく、スタートアップがやる動機は小さい。
      以前CortanaとAlexaの両方で働いていて、LLMの進歩を踏まえて最初から新バージョンを作ることもかなり考えた。技術は全体として直感的だったし、今なら可能になった新しいユースケースのアイデアもあったが、成り立つビジネスモデルを見つけられなかった。なので今は完全に別の仕事をしている
    • ChatGPTが何かを最初に知ったときの感想は「なるほど、Siriは本来こうあるべきだったのか」だった
    • ChatGPTとBingを使って以来、Alexaと会話するのは滑稽なくらいだ。性能の良いハードウェアがひどいソフトウェアのせいで何年も足を引っ張られているのを見ると、本当に歯がゆい
    • MicrosoftはWindows 11でCortanaを置き換えるためにそれをやっている
    • Home Assistantを制御するのに使える何かを本当に期待している。
      ただ、そのためにクラウドベースのAPIを使うのは不安すぎるので、家の中のサーバーで動くものがほしい。同時に、音声認識と応答時間が非常に速く、待たされている感じがまったくしない必要がある。
      個人アシスタントのDIYの試みは何度か見たが、いつもかなり大きな遅延があって、頻繁に使うとすぐにいらいらしそうだ
  • { "name": "grande latte" } のような応答を受け取りやすいという話がある。
    でも、型が Item = { name: string; ... size?: string; } なら、これでどうやって name: "grande latte" を避けられるのかよく分からない。
    例の応答には "size": 16 が入っていて「かなり素晴らしい」と言っているが、実際には要求した型すら返していない。おそらく例のタイプミスだと思うし、そうならアイデア自体は良さそうだ

    • 指摘ありがとう。ブログ記事の以前の版では、size が誤って number に指定された別のスキーマを使っていた。スキーマは変更したが、プロンプトを再実行しておらず、今は修正されているはず
    • この例は全体としてかなり弱いと思う。単なるタイプミス以上の問題だ。
      そもそも name の文字列フィールド自体を欲しくない可能性が高い。{ name: “the brown one”, size: “the espresso cup”, … } のような値が返るのを防げず、これは元の文字列をパースするのと同じくらい悪い。
      おそらく、各フィールドについて既知の値を表す大きな文字列ユニオン型が欲しいはずだ。そうすればLLMにその中から当てさせられる。
      しかし、なぜそれを型構文に縛る必要があるのかも疑問だ。ランタイムデータを使ってそのようなユニオン型を構成できるZodのようなもののほうが適しているように見える。
      数量は正の整数で分数であってはならない、といった制約も必要だ。もちろんJSON値を後で検証することはできるが、そうするとユーザーは2種類のエラーを見ることになる。1つはLLMが流暢な人間の口調で出すエラーで、もう1つは「数量の値が大きすぎます」のような妙に技術的なエラーだ。
      こういうことを表現する場所として、型構文は不適切に見える
    • 単なるドキュメントのバグに見える。発表文を仕上げる終盤でオンス表記から標準サイズに変えて、出力値のほうを合わせて変えるのを忘れたのだと思う。
      提供されたコードだけでは、システムが「grande」を16にマッピングする方法はないし、16が他の場所で使われているようにも見えない
    • 続く段落で「型を無視するとどうなるか」を扱っているので、たぶんそちらの意図で書いたのだと思う
  • 型チェックを通る何かを吐き出すまでLLMを繰り返し実行し、エラーメッセージで再度プロンプトを与える方式のように見える。
    かわいいアイデアだし動きそうではあるが、大きなモデルと長い入力プロンプトではコストがかさむ可能性がある。あらゆるシナリオの解決策ではなさそうだ

    • 少なくともOpenAIなら、内部的に新しい関数呼び出し機能を使うほうがよくないだろうか?
    • TypeChatがどう動くのかはよく分からないが、Guidance [1]も似たプロジェクトで、実際にトークンサンプリングに統合して形式を強制できる。
      [1]: https://github.com/microsoft/guidance
    • たいていの製品は、まずプロダクトマーケットフィットを気にして、そのあとでコストを下げていこうとする気がする。
      市場が構造化出力を求めているのだから、モデル側もそちらに改善されていくだろうというのは、かなり妥当な仮定でもある
  • 今週、Laravel PHP向けにこれと非常によく似ているものの、よりスコープの小さいものを作って公開した: https://github.com/adrenallen/ai-agents-laravel
    エンジニアは、与えられたLLMで新しい「ボット」を簡単に立ち上げられるべきだと思う。関数をChatGPTが理解できる形に変換し、応答を処理して再度パースするという退屈な作業が多い
    こうしたシステムを使えば、実際のPHPコードを書いて明確なコメントをいくつか追加することに集中でき、そうすればボットはどんな作業でもそのコードをツールとしてすぐ使える
    また、このやり方はコード共有をはるかに容易にする。誰かが関数を書けば、新しいボットに持ち込んですぐ使える。「LLMが使って理解できるように変換する層」をなくしてくれる点がすばらしく、ビルド速度も大きく向上する
    まだ完璧ではないが、お互いのコードをもっと活用するには、結局すべてがこの方向に進むと思う。今日のコーディングでパッケージマネージャーを使うやり方を考えると、AI専用ツール向けのパッケージマネージャーがあってほしい。「天気を取得する」ライブラリをインストールして自分のボットに追加すれば、天気を取得できるようになる、という感じだ

    • 似ているがもう少し広い範囲のアプローチを進めているので、スターを付けた。いくつかのアイデアは本当に洗練されている
  • ちょっと待って、これはTypeScriptの型定義に対してオブジェクトをランタイム検証しているのか? 独立したライブラリや機能として配布できるなら、TypeScriptコードベースでのAPIレスポンスのペイロード検証などにとって完全にゲームチェンジャーになり得る

  • ここでguidance [0]を使っていないのは非常に意外だ
    必須フィールドの補完を提案できるので、検証[1]の必要性を減らせて、結果的にGPU時間も節約できそうだ
    きっと理由はあるのだろうが、ぜひ知りたい
    余談だが、まさにこういうものを作っていたところにMicrosoftが急に現れて、自分の昼飯をかっさらっていった感じだ
    [0] https://github.com/microsoft/guidance
    [1] https://github.com/microsoft/TypeChat/blob/main/src/typechat...