はじめに
2024年8月頃からAWS上でBedrockを使って社内向け生成AIチャットボットを作っています。
初めて生成AIを使ってみたところで色々考える点があったので、メモとして残しておくことにしました。
生成AI技術が日々すごいスピードで進歩しているので既に古い技術になっていそうなのと、そもそも初心者が書いておりますで、あまり技術的な参考にはならないと思いますが、ポエム的な感じ?でお読みいただけたら幸いです。
考えたこと⑤ フロー・プロンプト・その他
前回までは構成について書いてきました。
今回は最終回として、Difyのフローやプロンプト周りで考えたことをつらつらと書いていきたいと思います。
フロー
LLM操作はDify側で行う
開発初期の頃ですが、ナレッジベース&回答生成を行うために、RetrieveAndGenerate APIを呼び出していました。初期の頃の質問したらちゃんとそれっぽい回答返ってくるね。くらいの時は問題なかったのですが、回答の形式だったり回答文言の正確性を求めるようになってきた段階になってくると段々と扱い辛くなってきました。
特に以下の2点がストレスでした。
- プロンプトがなかなか決まらず何度も何度も更新する時にAPI側で修正するのが面倒
- 回答として返却されるとデバッグしにくいし後続タスクでの使い勝手が悪い
このため、APIはRetrieve APIで検索だけ行うことにして、回答はDify側のLLMブロックで行うことにしました。DifyのLLMブロックでプロンプトを書くようになってからはかなり作業効率が良くなりました。
LLMとコードの使い分け
LLMは本当に便利で何でもやってくれて、コードが書けない私には非常に有難く、JSONデータのパースなどの文字列処理もLLMに頼っていました。
しかし、LLMに頼りすぎると、便利の反面、以下のような問題がありました。
- なかなかビタっと言うこと聞いてくれるような指示を出すのが難しい
- 気分によっていろんな動きをされるのでイレギュラーなデータになることがしばしば
- LLMに頼るとちょっと時間かかる
そんなに難しい処理ではないのに指示だしに時間取られたくないということで結局コード化しました。
文字列操作や判断など正確さを求めるような処理はLLMではなくコード化するのが良いと思います。逆にLLMにはコードを書くときに助けてもらう感じで。
プロンプト
指示は小さいものにする
LLMへの指示においては、気が付いたら色んなことを書いていたことにありました。
例えば、①RAG結果から適切な部分を抽出して、②ここの箇所に回答書いて、③回答なかったらこう書いて、④但しほにゃの場合は…etcみたいな感じです。
ここの指示を増やせば増やすほど正確性を出すのが難しくなっていった感じがありました。
①は必要だと思いますが、②はXMLタグに挟むくらいで良いでしょうし、③以降はコードで処理したほうがいいかもしれません。
色んな制約を与えたり段落で書いたりなど色んなテクニックがあるかと思いますが、コード処理しやすい形式として出すくらいのシンプルな指示がいいのではないかと思いました。
指示の言葉は正しく使う
ここは個人的に非常に苦手な部分なのですが、言葉のチョイスを間違えると動きが変わってきます。
例えば今回あったのは「回答して」「出力して」の違いでした。
過去のQAの文面を正確に出したいのにLLMが自分の意見を入れてくるといったケースが多く、見直したら「回答して」の指示が入っていたためでした。チャットボットへの指示なので何の違和感もなく「回答して」と指示していたのですが、「出力して」が正解でした。
見直すと当たり前のことなのですが、このあたりの指示の言葉の使い方は大事だなと思いました。
その他
スコアの取得
チャットボットの機能として、LLM回答の信頼性スコアが欲しかったのですが、これはApplyGuardRail APIで取得することにしました。このスコアの数字自体もどの程度信頼できるものなのか…と思うこともありますが、ユーザや運用者がLLM回答の評価に使えるいいスコアだと思いました。
プロンプトテクニック使いこなせず…
AdvancedRAGやHyDE、RAGフュージョンなどのテクニックを試してみたのですが、使い方が悪いのか、今回のチャットボットような簡単なものに合わないのか、精度向上に繋がらず私には使いこなせませんでした。。いずれにせよ勉強不足だと思うので次の機会にまた試してみたいと思います。
考えた結果
今回はプロンプトやフローを組み立てる上での考えたことを記載させていただきました。
初歩的なことばかりだと思いますが、LLMを使うにあたって色んな気づきがありました。
書いているうちにも入ってきている新しい技術をどんどん取り入れていって、使い易いチャットボットを作っていきたいと思います。
今回で最終回になります。全体的に拙い文章であったかと思いますが、最後までお読みいただきありがとうございました。