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

【要望】 RAGチャットの回答内容に参照したドキュメント(S3オブジェクト)のメタデータを含ませたい #668

Open
yusuke-takikawa-s opened this issue Oct 1, 2024 · 1 comment

Comments

@yusuke-takikawa-s
Copy link

要望

RAGチャットの回答内容に参照したドキュメント(S3オブジェクト)のメタデータを含ませる機能をリクエストいたします。

背景・経緯

通常、RAGチャットの回答内容には参照元となるドキュメントのURL(S3であれば、S3オブジェクトのURL)が表示されます。
RAGチャットの利用者にはS3へのアクセス権付与を想定していないため、RAGチャットの利用者がアクセス権を持っているGoogleドライブ等の、ドキュメントURLをS3オブジェクトのメタデータに設定して、そのメタデータをRAGチャットの回答に一律含ませたいと考えております。

@kazuya9831
Copy link

kazuya9831 commented Nov 3, 2024

@tbrandaws @wadabee @kazuhitogo

突然のご連絡すみません🙏
ブランチを作成する権限がなかったため、こちらで連絡させていただきますが、
こちらの issue(ソース URIのカスタム) の実装案を考えたのですが、いかがでしょうか。

現在も、S3の署名付きURLが払い出されるため、
S3へのアクセス権限がないユーザーでもソースURLにアクセスできる認識ですが、
署名付きURLを払い出したくない場合にソースURIをカスタムできると嬉しいなと思っています。

実装案

名前は仮ですが、 x-custom-source-uri というメタデータを優先し、
なければ今まで通り、S3のURIが返されるようにしています。

  • 修正ファイル

    • // Prompt を使いまわすために Amazon Kendra の retrieve item と同じ形式にする
      // Knowledge Base のみを利用する場合は本来不要な処理
      const retrievedItemsKendraFormat: RetrieveResultItem[] =
      retrievedItems.data.retrievalResults!.map((r, idx) => {
      const sourceUri =
      r.metadata?.['x-amz-bedrock-kb-source-uri']?.toString() ?? '';
      return {
      Content: r.content?.text ?? '',
      DocumentId: `${idx}`,
      DocumentTitle: sourceUri.split('/').pop(),
      DocumentURI: convertS3UriToUrl(sourceUri, modelRegion),
      };
      });
  • 修正点

$ git diff 
diff --git a/packages/web/src/hooks/useRagKnowledgeBase.ts b/packages/web/src/hooks/useRagKnowledgeBase.ts
index e144f9b..ef11502 100644
--- a/packages/web/src/hooks/useRagKnowledgeBase.ts
+++ b/packages/web/src/hooks/useRagKnowledgeBase.ts
@@ -97,13 +97,18 @@ const useRagKnowledgeBase = (id: string) => {
       // Knowledge Base のみを利用する場合は本来不要な処理
       const retrievedItemsKendraFormat: RetrieveResultItem[] =
         retrievedItems.data.retrievalResults!.map((r, idx) => {
+          // ソース URI は ユーザーが追加したカスタムメタデータを優先して利用
+          // タイトルは S3 URI の最後の部分を利用
+          const metadata = r.metadata ?? {};
+          const kbSourceUri =
+            metadata['x-amz-bedrock-kb-source-uri']?.toString() ?? '';
           const sourceUri =
-            r.metadata?.['x-amz-bedrock-kb-source-uri']?.toString() ?? '';
+            metadata['x-custom-source-uri']?.toString() ?? kbSourceUri;
 
           return {
             Content: r.content?.text ?? '',
             DocumentId: `${idx}`,
-            DocumentTitle: sourceUri.split('/').pop(),
+            DocumentTitle: kbSourceUri.split('/').pop(),
             DocumentURI: convertS3UriToUrl(sourceUri, modelRegion),
           };
         });
$ 
  • 文字だと分かりづらいかなと思ったため、画像も添付します。
image

動作例

例えば、以下のようにオブジェクトとメタデータを作ります。

  • S3バケットのオブジェクト
bedrock-ug.pdf
bedrock-ug.pdf.metadata.json
  • bedrock-ug.pdf.metadata.json の中身
{
    "metadataAttributes": {
        "x-custom-source-uri": "https://www.example.com"
    }
}

見た目は同様ですが、リンクが x-custom-source-uriで指定したリンクになります。

image

そのため、リンクをクリックすると、指定したリンクに飛べます。

image

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