🤖

サバイバルTypeScriptのGPTsを作成・公開しました

2024/03/09に公開

サバイバルTypeScriptは有志で執筆を進めているTypeScriptのOSSドキュメントです。
https://typescriptbook.jp/

今回、サバイバルTypeScriptのドキュメントをベースにTypeScriptに関する質問に答えてくれるGPTsを作成・公開しました✨

この記事ではGPTs公開の背景や作成手順、現状の課題などをまとめています。

https://chat.openai.com/g/g-EzVTRSzR7-sabaibarutypescript

GPTs公開の背景

LLMによるドキュメント検索は近い将来(既に?)一般的になると思い、サバイバルTypeScriptでも実験的にチャットボットでの情報アクセスを作成・公開しました。

ドキュメントの情報アクセスの課題

  • ドキュメントが多くなると、目次やサイトマップ、サイト内検索だけでは必要な情報にアクセスするのが困難になる。

チャットボットのメリット

  • 雑な質問でも意図を汲んで、知りたい情報にアクセスしやすい
  • 内容を要約して説明してくれるので、手軽に情報にアクセスできる

回答の信頼性を高める工夫

GPTsを作成するにあたり、回答の最後に参照ドキュメントのリンクを提示させることを意識して作成をしました。

ChatGPTなどのLLMをインターフェースとして情報アクセスする場合の、課題としてハルシネーションによる情報の信頼性があります。

この問題を解決したかったので、サバイバルTypeScript GPTs では質問に対して回答をした上で、質問者がより詳しく情報を読めるために、回答時の参照ドキュメントをリンクとして提示するようにしています。

これにより、シンプルなドキュメントの検索機能としても活用できるようになっています。

GPTsの作成手順

ここからは実際にGPTsを作成した手順を紹介します。

知識データの作成

GPTsが参照する知識データはドキュメントごとの以下のキーを持つjsonデータを作成しました。

  • title: ドキュメントのタイトル
  • content: ドキュメントの内容(Markdownテキスト)
  • url: ドキュメントのURL

contentの値はドキュメントのMarkdownファイルの中身をそのまま使用しており、データ整形は一切していません。

docs.json
{
  "docs": [
    {
      "title": "anyとunknownの違い",
      "content": "# anyとunknownの違い\n\n`any, unknown`型はどのような値も代入できます。....",
      "url": "https://typescriptbook.jp/reference/statements/any-vs-unknown"  
    },
    ...
  ]
}

プロンプト

続いてプロンプトです。
最初は日本語で書いていたのですが、英語の方が気持ち精度が良くなっている気がしたので、最終的には英語のプロンプトにしています。

プロンプトでは次の点を考慮して指示を書いています。

  • 知識データ(サバイバルTypeScript)に基づいて回答をすること
  • 知識データに含まれるURLだけを回答に追加すること(存在しないURLを生成しないこと)
  • Markdown形式で表示せずにURLを直接表示すること
docs.json is a file contains information for pages of "サバイバルTypescript" which is the document for TypeScript.

Please answer the question by Japanese based on docs.json and the following answer process.

## answer process
1. Search in the docs.json based on topics and keywords related to the question and provide information.
2. Add document url and title which you referenced to your answer.
3. Url and title must be contained in the docs.json
4. Don’t use markdown syntax when you write a hyper link and write the url.
5. Answer by Japanese

2,3の部分で回答の最後にドキュメントのURLを提示するように指示をしています。
知識データに存在しないURLを勝手に生成しないように、知識データに存在するURLだけを追加するようにお願いをしています。

2. Add document url and title which you referenced to your answer.
3. Url and title must be contained in the docs.json

4の部分でURLを直接表示するように指示出しています。

この指示をしている理由は、ハルシネーションの問題で存在しないURLを生成してしまうことがあり、[タプル (tuple) ](https://typescriptbook.jp/reference/values-types-variables/not-exists)のようにMakrdown形式で存在しないリンクが生成されてしまうと、クリックをしてもページ遷移すらしない問題が発生します。
少なくともURLを見える形にすることで、存在しないURLが生成されていることをユーザーが把握できるようにするためにURLを表示するように指示を出しています。

ただ、割と意図に反してMarkdown形式でリンクを生成することが多々発生しています。

4. Don’t use markdown syntax when you write a hyper link and write the url.

ドメインの追加

ChatGPTは Settings > Builder profile からドメインの登録をすることができます。

これを設定することでGPTsで作成者として指定したドメインを表示して、Webサイトへのリンクを表示することができるようになっています。

ドメインの登録方法は、追加ボタンを押すと認証トークンが発行されるので、これをDNSサーバーのTXTレコードに追加して認証をすれば登録が完了します。

GPTs作成で得たノウハウ

知識データにはJSONフォーマットを使う

最初にGPTsを構築した時に知識データとしてCSVファイルを使用していました。

ただ、存在しないURLが頻繁に生成されたりと思ったような精度が出ずに悩んでいたのですが、CSVファイルの場合にコードインタプリターでデータ参照しており、実行コードを除いてみると思ったよりも単純なキーワードでドキュメント検索をしてデータを参照していることに気づき、試しにJSONフォーマットに変更したら精度が格段に向上しました。

関係があるのかよく分かっていないですが、JSONフォーマットの場合はコードインタプリターを介さずにデータアクセスをしているので、今後は特段な理由があればJSONフォーマットを使っておくのが安定かなと思っています。

GPTsに利用するファイルフォーマットのベストプラクティスについては、フォーラムでも議論されています。

https://community.openai.com/t/gpts-best-file-format-for-knowledge-to-feed-gpts/497368

現状の課題点

存在しないドキュメントURLを生成する

今まで何度か言及してきていますが、回答の中で知識データに存在しないURLを生成したり、少し壊れたURLを生成することがあります。

JSONフォーマットへの変更やプロンプトの調整で、発生頻度は作成当初と比べて減らすことはできましたが、それでも一定の確率で発生している状態です。

精度100%を求めたら、一生公開ができないと思ったので、一旦はこういうモノと受け入れている状態です。ただ、クリティカルな問題なので改善はしていきたいです。

コミュニティでGPTsを共同編集できない

現時点では、GPTsは作成したアカウントに紐づく状態になっており、複数人で共同編集する仕組みが提供されていないため、コミュニティとしてGPTsを改善することが難しい状態になっています。

OSSコミュニティとして健全な状態ではないので、プロンプトや知識データの生成スクリプトをリポジトリで管理してGPTs構築の再現性を共有することで、擬似的に共同編集できる形式にしています。

おわりに

サバイバルTypeScriptはまだまだ多くのISSUEがあります。
https://github.com/yytypescript/book/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc

執筆会も実施していますので、興味ある方いましたら参加をお待ちしております。✏️
https://yyts.connpass.com/

Discussion