Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【要望】システムコンテキストのQAごとのDynamoDBへの保存(RAGチャット) #699

Open
kazuya9831 opened this issue Nov 4, 2024 · 2 comments

Comments

@kazuya9831
Copy link

機能リクエストは何か問題に関連していますか?背景を説明してください

  • 概要
    RAG チャットにおいて、システムコンテキストが初回質問の際にしか保存されないため、
    2回目以降もシステムコンテキストが保存されるようにしていただけないでしょうか。
    (QAごとに検索に引っかかったドキュメントのログが欲しいため。)

  • 詳細
    以下のように2回やり取りを行います。

image

以下はDynamoDBの画面ですが、初回はシステムコンテキストが保存されております(1行目)が、
2回目はシステムコンテキストが保存されませんでした。
(roleがuser(4行目)とassistant(5行目)しか保存されていない)

image

追加 or 改善したい機能について

  • 改善したい機能
    2回目以降もシステムコンテキストが保存されるようにしていただきたい
    もしくは検索結果を別で保存していただきたい

試したこと

  • 概要

以下のようにpushMessageを利用しmessagesにシステムコンテキストを保存することで
2回目以降のシステムコンテキストもDynamoDBに保存できるようになりました。
ただし、1回目だけ2つシステムコンテキストが保存されるようになってしまいました...

対象ファイル:https://github.com/aws-samples/generative-ai-use-cases-jp/blob/c20c70e8c510bde4ce3f31937f669657683e8d50/packages/web/src/hooks/useRagKnowledgeBase.ts

実装:
image

実装結果:
2回目以降のシステムコンテキストもDynamoDBに保存できるようになったが、
1回目だけ2つシステムコンテキストが保存されるようになった

image
@tbrand
Copy link
Contributor

tbrand commented Nov 5, 2024

ありがとうございます!

実現したいことについて

実現したいことについてもう少し詳細に教えてください。
「QAごとに検索に引っかかったドキュメントのログが欲しいため」であれば、2 回目の質問時に「最初からやり直す」ボタンを使っても良いのかなと思ったのですが、連続で質問することに何か意味があるのでしょうか。

システムコンテキストが 1 度しか保存されない技術的な理由

そもそもメッセージが保存されるかされないかの判断は、messageId というものが付与されているかどうかで内部的に判断しています。
初回のシステムコンテキストは messageId が付与されていないので、保存されます。

2 回目以降のシステムコンテキストは updateSystemContext で既存のものをこのように置き換えるため
https://github.com/aws-samples/generative-ai-use-cases-jp/blob/main/packages/web/src/hooks/useChat.ts#L527
初回に付与された messageId が使いまわされます。そのため保存 "されない" 対象として扱われることになります。

よって updateSystemContext が呼び出されるたびに messageId を削除すれば、想定した動作になるのでは予想しますが、
ここのロジックは他のユースケースにも多用されている箇所なため、変更には注意が必要です。

初回に 2 回保存されるのは、updateSystemContext と pushMessage で messageId が付与されていないシステムコンテキストが 2 つ存在するためです。

ちなみに、messages の中に複数のシステムコンテキストがある場合は、最初のものが選択される仕様になっているようです。
https://github.com/aws-samples/generative-ai-use-cases-jp/blob/main/packages/cdk/lambda/utils/models.ts#L180

@kazuya9831
Copy link
Author

kazuya9831 commented Nov 5, 2024

@tbrand

ご連絡ありがとうございます!

「QAごとに検索に引っかかったドキュメントのログが欲しいため」であれば、2 回目の質問時に「最初からやり直す」ボタンを使っても良いのかなと思ったのですが、連続で質問することに何か意味があるのでしょうか。

連続で質問することに特に意味はありません。
(連続で質問したいケースはほぼないと思っているため、連続で質問をしたい要望は特にありません)

ただ、ユーザーはそういったことを意識せずに同一チャット内で色々な質問をすると思いますので、
2回目の質問の際にも、システムコンテキスト(回答の参考にしたドキュメント情報)が保存されるようになっていると
RAGの分析の際に役に立つのでは?と考えております🙏

あくまで回答の参考にしたドキュメント情報が欲しいため、システムコンテキストの保存しなくても
別のアプローチがございましたら、私としては、その方法でも特に問題ございません🙇

また、システムコンテキストが 1 度しか保存されない技術的な理由のご説明、ありがとうございます。

よって updateSystemContext が呼び出されるたびに messageId を削除すれば、想定した動作になるのでは予想しますが、
ここのロジックは他のユースケースにも多用されている箇所なため、変更には注意が必要です。

質問のたびにシステムコンテキストが保存されることになると思うので、
RAG以外のユースケースでは、無駄なログになりそうで、確かに注意が必要だなと理解しました。

私の知識不足でコードの作りが(typescript自体も)全然わかっていないですが、updateSystemContext がさまざまなところで使われているのは
なんとなく理解しているので、改修は簡単にはできないだろうなということもイメージが湧きました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants