Zenn

LangGraphのTool Callingを利用して、RAG Agentsを構築する(前編)

2025/02/17に公開
19

はじめに

Google CloudのVertex AIを活用して、RAGを構築しないといけなくなったので、その方法をまとめていきます。
まずは準備として、ローカルのみで実装をしていきます。

今回の記事では、ローカルに保存したテキストドキュメントをベースに、ローカルのDBにベクトルデータを保存し、LangGraphでRAGを実装していくことを考えます。
その上で、次回以降の記事で、Google CloudのGCSにドキュメントを置いたり、BigQueryをベクトルストアにしたり、Cloud SQLをベクトルストアにしたりする方法を解説していきたいと思います。

参考文献

(書籍のリンクはamazonアフィリエイトリンクです)

記事

LangChainからLangGraphによるAgent構築への移行方法
https://python.langchain.com/docs/how_to/migrate_agent/

Chroma DBによる類似度検索のメソッド
https://python.langchain.com/docs/integrations/vectorstores/chroma/

カスタムRetrieverクラスの作成方法
https://github.com/langchain-ai/langchain/blob/22219eefaff48e869327e24e8f3fcde52781d03f/libs/core/langchain_core/retrievers.py#L68

LangChainでのドキュメントローダ
https://python.langchain.com/docs/integrations/document_loaders/

GoogleのGen AIモデル
https://ai.google.dev/pricing?hl=ja#2_0flash
https://ai.google.dev/pricing?hl=ja#text-embedding004

書籍

LangChainとLangGraphによるRAG・AIエージェント[実践]入門
ChatGPT/LangChainによるチャットシステム構築[実践]入門
LangChainを利用することで、あらゆるモデルを統一的なコードで実行できるようになります。
langchainに関しては、こちらの書籍を読めば大体のことはできるようになりますので、おすすめです。
また、現在推奨されているLangGraphでのRAG Agentを構築するcreate_react_agentに関しても説明されておりますし、さらに複雑なAgentsの構築方法やデザイン方法も網羅されており、とても勉強になります!

大規模言語モデル入門
大規模言語モデル入門Ⅱ〜生成型LLMの実装と評価
よく紹介させていただいておりますが、こちらの書籍は、LLMのファインチューニングから、RLHF、RAG、分散学習にかけて、本当に幅広く解説されており、いつも参考にさせていただいております。
今回の記事で紹介したRAGの内容だけでなく、さらにその先であるRAGを前提としてInstruction Tuningについても触れており、とても面白いです。
LLMを取り扱っている方は、とりあえず買っておいても損はないと思います。
さまざまな章、ページで読めば読むほど新しい発見が得られる、スルメのような本だなといつも思っております。

LLMのファインチューニングとRAG ―チャットボット開発による実践
上記2冊の本よりもRAGやファインチューニングに絞って記載されている書籍です。だいぶ平易に書いてあるのでとてもわかりやすいと思いました。
また、本記事の内容ではないですが、RAGを実装する上でキーワード検索を加えたハイブリッド検索を検討することは一般的だと思います。本書はそこにも踏み込んで解説をしています。
また、キーワード検索でよく利用するBM25Retrieverが日本語のドキュメントに利用する際に一工夫がいるところなども紹介されており、使いやすい本だなと思いました。

成果物

下記のGithubをご覧ください。
https://github.com/personabb/genai_RAG_sample

実行までの準備と実行方法

環境

著者の環境は下記です。
OS:MacOS 15.2
Python:3.11.9

APIキーを設定する

今回は、GoogleのAPIキーを利用します。
まだ設定していない方は下記の記事などを参考に、「Google AI Studio」から、APIKeyを取得して、利用できるようにしておいてください。
https://zenn.dev/peishim/articles/2e2e8408888f59

なお、今回は無料のモデル(text-embedding-004gemini-2.0-flash-001)しか利用しないため、料金はかかりません。ご安心ください。

リポジトリをクローンする

下記のコードでリポジトリをクローンします。

git clone https://github.com/personabb/genai_RAG_sample.git

必要なパッケージをインストールする

下記のコマンドで必要なパッケージをインストールします。

pip install -r requirements.txt

上記で動かない場合は、下記も試してみてください。
(現時点での著者のバージョン付きパッケージです)

pip install -r requirements.lock

コードを実行する

DBへの登録

python upload_vactorstore_local.py  

LLMにRAGで回答させる

python search_rag_documents_local.py

もしくは

python search_rag_documents_local_tools.py

上は普通にLangChainで、RAGをChainとして実装したコードで、下は、LangGraghのcreate_react_agentを利用して、Tool Callingを含むAgentsとして実装したコードになります。

なお、ユーザからの質問文自体は、両コードともに、下記部分にて変更可能です。

search_rag_documents_local_tools.py

def main():
    # --- 定数定義 ---
  ・・・

    #質問文の例
    query = "16歳未満のユーザーが海外から当社サービスを利用した場合、親権者が同意していないときはどう扱われますか? そのときデータは国外にも保存される可能性がありますか?"
    #query = "おはよう"
    #query = "今日は12歳の誕生日なんだ。これから初めて海外に行くんだよね"

    ・・・

実施したこと

よくあるチュートリアルのような記事では、検索対象のドキュメントをベクトル化したDBに格納するコードと、実際にLLMがRAGを利用して質問に回答するコードが一緒になっていることも多いです。

しかし、実利用を考えると、これらのコードは分かれていて然るべきだと思いますので、本記事でも下記のように別々でコードを作成します

  • ドキュメントをEmbeddingモデルでベクトル化し、DBに格納するコード
  • DBに保存された内容から、LLMがRAGで質問に回答するコード

ドキュメントをEmbeddingsモデルでベクトル化し、DBに格納する

RAGを実施する上で、ドキュメントのベクトル化とDBに格納するフェーズが必要です。
RAGでは、このドキュメントのベクトルと、ユーザのクエルのベクトルの類似度をもとに、該当するドキュメントを探すことになります。

今回は、ダミーのプライバシーポリシーをo1先生に作成してもらい、そちらをドキュメントとして利用しました。
下記になります。

プライバシーポリシー
 第1条(総則・目的)
当社(以下「当社」といいます)は、ユーザーの皆様(以下「ユーザー」といいます)から取得する個人情報を適切に取り扱うことを社会的責務と認識し、本プライバシーポリシー(以下「本ポリシー」といいます)を策定いたしました。本ポリシーは、ユーザーが当社のサービスまたはウェブサイト(以下「当社サービス」といいます)を利用するにあたり、当社がどのような情報を収集し、どのように利用・管理し、どのような安全対策を講じるかを明確にし、ユーザーが安心して当社サービスを利用できるようにすることを目的としています。

当社は、日本国の個人情報保護法(個人情報の保護に関する法律)および関連するガイドライン、並びにGDPR(EU一般データ保護規則)その他各国の法令を遵守します。また、本ポリシーは当社ウェブサイト上にて常に閲覧可能な形で公開されており、ユーザーが当社サービスを利用した時点で本ポリシーの内容に同意したものとみなされます。もし本ポリシーの内容に同意いただけない場合は、恐れ入りますが当社サービスのご利用をお控えください。

当社は個人情報を大切な社会資源と捉え、その管理と保護を重要な責務として認識しております。ユーザーの個人情報を取り扱う際には、本ポリシーに則り、十分なセキュリティ対策のもと慎重に対応いたします。さらに、内部監査や従業員教育など組織的な取り組みを強化し、個人情報保護の重要性を改めて共有しています。万が一、漏洩事故や不正アクセスなどのリスクが顕在化した場合には、法令に則り迅速に情報開示と必要な対応を行う体制を整えています。

なお、本ポリシーは状況の変化や法令の改正などに伴って改訂される場合があります。最新の内容を確認されたい場合は、当社ウェブサイト内に掲載している最新版のプライバシーポリシーをご覧ください。当社が本ポリシーの変更を行う場合、重要な改訂点があるときにはユーザーに対して適切な方法で通知を行います。

当社はユーザーの同意を得た場合、または法令等に基づき正当な理由がある場合にのみ、ユーザーの個人情報を第三者へ提供または開示します。これはユーザーが自身の情報がどのようなタイミングで第三者に渡るのかを明確に理解するための重要な指針でもあります。当社は「個人情報の保護と有効活用の両立」を基本理念に掲げ、ユーザーが安心してサービスを活用できる環境づくりを目指してまいります。

さらに、当社は個人情報保護だけでなく、情報セキュリティの強化や適切なリスクマネジメントの推進にも力を入れています。具体的には、システムへのアクセス権限の厳格な制御、監査ログの取得や分析の実施、スタッフの研修など、多岐にわたる取り組みを行っています。また、国際的にも高い評価を受けているセキュリティ規格の取得を目指し、継続的な改善活動に取り組んでいます。

以上のとおり、当社は個人情報を保護するために最善を尽くしていますが、なお一層の安全管理を図るため、ユーザー自身にもパスワードやアクセス端末の管理を適切に行っていただく必要があります。本ポリシーが、当社とユーザーとの間での相互理解や信頼関係の礎となることを願っております。


第2条(用語の定義)
本ポリシーで使用する主要な用語は、以下のとおり定義します。

1. **個人情報(Personal Data)**: 当社がユーザーに関して取得・保有する情報のうち、特定の個人を識別できる情報を指します。具体的には、氏名、住所、メールアドレス、電話番号、生年月日、その他個人を直接的または間接的に識別可能な情報を含みます。なお、既存の情報と照合することによって個人を識別できる情報も含まれます。

2. **匿名化情報**: 個人情報から特定の個人を識別するための符号や要素を削除し、かつ他の情報と照合しても再び個人を識別できない状態に加工したデータをいいます。統計分析や学術研究のために利用される場合がありますが、再識別が生じないよう厳密な管理が必要です。

3. **Cookie**: ウェブサイトがユーザーのブラウザに送信する小規模のデータファイルであり、ユーザーのコンピューターやスマートフォン等に保存されるものを指します。Cookieにはセッション管理やユーザーの行動追跡など様々な用途がありますが、プライバシー保護の観点から取得・利用に際しては当社が責任を持って運用します。

4. **ログデータ**: 当社サービスへのアクセスや利用状況に関する記録(IPアドレス、ブラウザの種類、アクセス日時、滞在時間、リンククリック履歴等)を指します。アクセス解析や障害調査などに活用されることがあります。

なお、本ポリシーに記載のない用語については、個人情報保護法その他関連法令の定めるところによります。また、必要に応じて定義を追加または修正する場合があります。定義の変更を行う際には、当社ウェブサイト上での周知やメール等での通知を行う場合があります。変更後にユーザーが当社サービスを利用した場合、その変更を承認したものとみなされる点についてご了承願います。

さらに、当社ではこれらの定義がユーザーの理解を助けるための便宜的なものであることを付言します。法律での定義や規制に照らし合わせた場合、一部の表現や解釈に差異が生じる可能性があります。その際には、関連法令やガイドラインの規定が優先されることになります。


第3条(収集する個人情報の範囲)
当社は、当社サービスの提供に必要な範囲で個人情報を収集します。具体的には、以下のような情報が含まれますが、これに限定されるものではありません。

1. **ユーザー登録情報**:  
   会員登録時にユーザーが入力する氏名、メールアドレス、パスワード、住所、電話番号、生年月日、性別などが含まれます。これらは本人確認やサービス提供を行う上で必要となる基本情報です。

2. **決済情報**:  
   利用料金の決済を行う際に必要となるクレジットカード情報や銀行口座情報などが含まれます。ただし、当社がクレジットカード情報を直接保有しない場合もあり、その場合は決済代行会社などの安全なシステムを利用して処理を行います。

3. **ユーザーが自発的に提供する情報**:  
   プロフィール写真、自己紹介文、書き込みや投稿データ(コメント、画像、動画など)、カスタマーサポートへの問い合わせ内容、アンケート回答などが該当します。ユーザーはこれらの情報を提供する前に、公開範囲や第三者からアクセスされる可能性について十分ご理解いただく必要があります。

4. **端末情報およびアクセスログ**:  
   当社はCookieやウェブビーコン等の技術を活用して、ユーザーの利用端末情報(OS、ブラウザの種類、端末識別子など)やアクセスログ(IPアドレス、閲覧ページのURL、閲覧日時、滞在時間など)を自動的に収集する場合があります。これらの情報は、サービスの利便性向上や広告配信の最適化、セキュリティ確保などに活用されます。

5. **機微情報(センシティブ情報)の取扱い**:  
   法令で認められる場合を除き、人種、思想・信条、社会的身分、病歴、犯罪歴、刑事手続に関する情報、その他特別の配慮を要する個人情報については、ユーザーの明示的な同意を得ることなく取得しないことを原則としています。やむを得ず機微情報を取り扱う場合でも、厳重なアクセス制限や保管管理を実施し、漏洩リスクを最小化する努力を怠りません。

6. **SNS連携時の情報取得**:  
   当社サービスがSNSの認証や連携機能を提供する場合、SNSアカウントのユーザー名やメールアドレスなどが取得されることがあります。これらはユーザーの利便性向上を目的としており、あらかじめユーザーからの許可を得たうえで適切に取り扱います。

収集された個人情報は、第4条に示す利用目的の範囲内でのみ使用し、それ以外の目的で利用する場合にはあらかじめユーザーから明示的な同意を得ることとします。なお、当社はユーザーが提供した情報が虚偽であるなどの事態によりサービス提供に支障をきたす場合、ユーザーとの契約を解除あるいは利用を制限することがある点をご了承ください。


第4条(個人情報の利用目的)
当社が収集した個人情報は、以下の目的のために利用されます。

1. **当社サービスの提供・運営**:  
   ユーザー登録の管理、本人確認、決済処理、問い合わせ対応など、サービス提供に不可欠な手続き・機能を遂行するためです。具体的には、会員登録を行ったユーザーのアカウントを維持管理し、トラブル発生時の本人確認やサポート対応、決済不備のチェックなどを行います。

2. **カスタマーサポートの充実**:  
   ユーザーからのお問い合わせや苦情に対する適切な対応、サポート品質の向上、新機能開発の検討などを行います。たとえば、問い合わせ内容を分析してマニュアルやFAQを改善することで、より迅速かつ適切なサポートを提供することが可能となります。

3. **サービス品質の改善・開発**:  
   当社サービスに関するアクセスログや利用状況、操作履歴などの統計的な調査を行い、ユーザーのニーズや行動パターンを把握します。これにより、UI/UXの最適化や新機能の追加・改修など、サービス全体の品質向上に役立てます。アクセスログの解析から得られたインサイトは、ユーザー満足度の向上に繋がる重要な指標となります。

4. **セキュリティ対策・不正防止**:  
   アカウントの不正利用やシステム障害の監視・検知、リスク評価などのセキュリティ対策を実施します。例えば、多数のログイン失敗を検知した際に警告メッセージを送信したり、IPアドレスをブロックするなどの措置を講じることがあります。また、不正転売や詐欺行為を監視・排除するために、アクセス分析や異常検知を行う場合もあります。

5. **マーケティング活動**:  
   ユーザーの同意に基づき、電子メールやプッシュ通知を通じてキャンペーン情報や新商品・新サービスのご案内を行うことがあります。ユーザーの興味・関心に合わせたパーソナライズド広告を配信する場合もありますが、その際にはユーザーが自由に配信停止を行えるメカニズムを提供します。当社は、広告やプロモーションもユーザーにとって役立つ情報を提供する手段であると考えています。

6. **法令上必要な対応**:  
   裁判所や警察などの公的機関から法的に有効な開示請求があった場合、または法令で認められるその他の手続きを遂行するために情報を利用することがあります。例えば、捜査協力においてログデータの開示が求められた場合には、関係法令に基づき適切に対応いたします。

これらの目的以外で個人情報を利用する場合には、事前にユーザーの同意を得るか、もしくは当該利用が法令で許容される場合に限り行います。利用目的の大幅な変更が生じる場合には、当社ウェブサイト上やメール等で通知を行い、必要に応じて改めてユーザーの同意を取得します。こうした手続きを通じて、ユーザーの意に反してデータが用いられないよう配慮しています。


第5条(個人情報の管理と安全対策)
当社は、ユーザーの個人情報を正確かつ最新の状態に保つよう努めるとともに、不正アクセス、漏洩、改ざん、滅失等のリスクを軽減するため、適切な技術的および組織的安全管理措置を講じます。具体的には以下のようなセキュリティ対策を実施しています。

1. **アクセス権限管理**:  
   データへのアクセスは業務上必要な範囲の従業員に限定し、ID・パスワードの管理やアクセスログの記録を徹底することで、権限のない従業員が利用できないようにしています。これには、役職や職務内容に応じた権限設計や、部署をまたいだアクセス制御などが含まれます。

2. **暗号化技術の使用**:  
   ユーザーが当社サービスを利用する際、SSL/TLSなどのプロトコルを用いて通信を暗号化し、データの盗聴や改ざんを防止します。さらに、パスワードやクレジットカード情報など機微なデータはハッシュ化やトークン化など適切な手法で保護します。

3. **定期的な監査と脆弱性診断**:  
   外部専門機関と連携し、サーバーやネットワーク機器に対する定期的な脆弱性診断を実施しています。また、内部監査を行い、セキュリティポリシーや運用手順が遵守されているかを定期的にチェックします。こうした取り組みにより、セキュリティレベルを継続的に向上させる仕組みを維持しています。

4. **従業員教育と内部統制**:  
   プライバシー保護や情報セキュリティに関する社内研修を定期的に実施し、全従業員が最新の脅威や対策方法を理解するよう努めています。さらに、セキュリティポリシーを遵守しない行為に対しては懲戒制度も設け、組織的な内部統制を行っています。

5. **委託先の監督**:  
   個人情報の取り扱いを外部企業へ委託する場合には、委託先との契約により適切な安全管理水準を義務付け、定期的にその実施状況を確認します。必要に応じて改善要請を行うなど、委託先が当社の基準を満たすように管理しています。

当社は、万が一、個人情報が漏洩または不正利用された場合には、速やかに事実関係を特定し、被害の拡大を防止するための措置を講じるとともに、関係当局への報告やユーザーへの通知を行うなど、適切な対応を実施します。また、再発防止策を立案・実施することで、同様のリスクが再び生じないように努めます。


第6条(第三者提供)
当社は、ユーザー本人の同意を得た場合、または法令に基づく開示義務がある場合を除き、個人情報を第三者に開示または提供しません。ただし、以下の状況が発生した場合はこの限りではありません。

1. **業務委託**:  
   当社が外部企業に対して業務を委託する場合に、業務遂行上必要となる個人情報の一部を提供することがあります。たとえば、メール配信サービスやデータ解析サービスを委託するケースなどが該当します。この場合、当社は委託先との契約により守秘義務を課し、委託先の安全管理体制を確認・監督します。

2. **事業承継**:  
   合併、会社分割、営業譲渡、その他の事由により事業が継承される場合、個人情報が承継される可能性があります。ただし、その際には利用目的の範囲内でのみ継承され、ユーザーに対して事前に通知または公表されます。事業承継時にプライバシー保護の水準が下がらないよう、厳格な審査を行います。

3. **統計データの開示**:  
   匿名化処理された統計データについては、ユーザー個人を特定できない形で第三者に提供することがあります。マーケティング分析や市場調査レポートなどに活用される場合がありますが、再識別が発生しないよう厳重に管理します。

なお、当社が第三者に個人情報を提供する際には、法令に従い契約書の締結など必要な手続きを行い、適切な管理・監督に努めます。また、第三者提供が行われた場合には、ユーザーが希望すれば、提供先企業や提供内容の概要を開示いたします。ユーザーは、本ポリシーや利用規約で定める手続きに従い、第三者提供に関する詳細を確認する権利を有します。


第7条(Cookie・トラッキング技術の利用)
当社は、ユーザーの利用状況をより詳細に把握し、サービス向上や広告配信の最適化を目的として、Cookieやウェブビーコン、その他のトラッキング技術を利用する場合があります。これにより、ユーザーのブラウザやデバイスを識別し、ログイン状況の維持やパーソナライズされたコンテンツを提供することが可能となります。

1. **Cookieの役割**:  
   Cookieを利用することで、ユーザーが再度訪問した際の利便性が向上します。たとえば、ログイン情報の保持や言語設定の記憶などを行い、ユーザーエクスペリエンスを改善します。

2. **Cookieの拒否**:  
   ユーザーはブラウザの設定によりCookieの受け取りを拒否することが可能ですが、その結果、一部の機能が正常に動作しない場合があります。たとえば、自動ログイン機能が働かなくなったり、サイト表示が最適化されないことがあります。

3. **第三者トラッキング**:  
   第三者が提供する広告配信サービスを利用する場合、第三者によるCookieの設定や広告IDを使用した行動履歴の分析が行われることがあります。これにより、ユーザーの興味関心に応じた広告が表示される場合がありますが、オプトアウトの手続きを行うことである程度制限できるケースもあります。

4. **国際的なルールとの関係**:  
   Cookieやその他のトラッキング技術に関しては、国際的に統一された公理やルールが存在するわけではありません。各国の法令やガイドライン、業界標準などを考慮しながら運用されているため、ユーザーが居住する地域の規制によっては追加的な同意取得が必要な場合があります。

これらの技術を活用することで、当社はサービスの品質向上や適切なマーケティング活動を実現していますが、ユーザーのプライバシー保護にも十分配慮し、必要に応じて同意取得やオプトアウトの仕組みを提供するよう努めます。


第8条(国際データ移転)
当社は、日本国内だけではなく、ユーザーが所在する国または地域とは異なる管轄のサーバーやデータセンターを利用する場合があり、ユーザーの個人情報が国外へ移転されることがあります。たとえば、クラウドサービスプロバイダを通じて海外にあるデータセンターで個人情報を保管する場合などが挙げられます。

1. **保護水準の確認**:  
   このような国際的なデータ移転に際しては、移転先の国や地域における個人情報保護法制が日本またはEUなどの基準と同等以上の水準にあるかどうかを確認し、必要に応じて適切な契約(EU標準契約条項など)を締結するなど、個人情報が適切に保護される体制を整備します。

2. **ユーザーの明示的同意**:  
   ユーザーの明示的同意を得ることなく国際データ移転を行う場合、当社は日本国法令や国際ルールで認められた要件を満たす範囲でのみ実施します。たとえば、データの暗号化や仮名化を徹底することで、リスクを最低限に抑えた状態でデータを取り扱う措置を講じます。

3. **越境データのセキュリティ確保**:  
   国際回線を経由してデータを送信する場合、盗聴や改ざんのリスクが考えられるため、VPNの利用やSSL/TLS通信などを組み合わせ、情報が不正に傍受される可能性を極力排除します。さらに、国外のデータセンターへのアクセス権限を厳格に制限し、監査ログを取得・分析することで、不正アクセスを検知・阻止できる仕組みを維持しています。

4. **ユーザーへの周知**:  
   国際データ移転がサービス提供上不可避である場合、当社は利用規約や本ポリシーにてその旨を周知し、ユーザーがそのリスクや対策内容を理解できるよう配慮します。ユーザーが海外でサービスを利用する際には、各国の法規制やインターネットインフラ状況を踏まえて、データがどのように移転・保護されるのかを検討する必要があります。


第9条(保有個人情報の開示・訂正・削除)
ユーザーは、当社が保有しているユーザー自身の個人情報について、開示、訂正、追加、削除、利用停止、または第三者提供の停止(以下「開示等」と総称)を請求する権利を有します。当社は、ユーザーからの開示等に関する請求があった場合、法令に基づき合理的な範囲で対応します。請求を希望される場合は、当社所定の手続き(本人確認等)を経たうえで、当社カスタマーサポートまでご連絡ください。

1. **開示の請求**:  
   当社が保有する個人情報の種類や利用目的、第三者提供の状況などを開示します。ただし、他のユーザーや第三者の権利利益を害するおそれがある場合、または当社の業務運営に著しい支障をきたすおそれがある場合には、一部情報を非開示とすることがあります。

2. **訂正・追加・削除の請求**:  
   ユーザーが当社保有の個人情報について誤りがあると認識した場合、訂正や追加を請求できます。また、利用目的に照らして必要がない情報については削除を請求できます。法令上保存義務のある情報については削除できない場合がありますが、その場合は理由と保存期間をユーザーに説明します。

3. **利用停止・第三者提供の停止**:  
   当社による個人情報の利用が不適切または法令違反であると判断される場合、ユーザーは利用停止や第三者提供の停止を請求できます。当社は、請求内容を精査し、法令に則った対応を講じます。

4. **手数料**:  
   開示等の手数料については、当社が別途定める方法により請求させていただく場合がありますので、あらかじめご了承ください。

上記のように、当社はユーザーの権利を尊重し、迅速かつ誠実な対応に努めます。ただし、請求内容によっては相当の期間や追加資料を要する場合があります。その際には手続きの進捗状況や必要な対応を速やかにユーザーへ連絡します。


第10条(未成年者の個人情報)
当社は、16歳未満のユーザーが当社サービスを利用する場合、法定代理人(親権者等)の同意を得ることが必要である場合があると認識しています。ユーザーが未成年者であるにもかかわらず同意を得ていない場合、もしくは未成年者である旨を偽って利用登録を行った場合には、当社は一切の責任を負いかねます。

1. **親権者の同意取得**:  
   未成年者がサービスを利用するにあたっては、親権者が本ポリシーの内容を確認したうえで利用に同意することが望ましいと考えています。特に決済手段の登録や外部サービスとの連携など、リスクの高い行為については慎重な対応を求めています。

2. **未成年者の個人情報保護**:  
   16歳未満の利用者の個人情報に関しては、一般のユーザーと同等のセキュリティ対策を講じていますが、必要に応じてより厳格なアクセス制限を設定する場合があります。たとえば、投稿やコミュニケーション機能を制限したり、年齢に応じたコンテンツ表示のフィルタリングを行うことが検討されます。

3. **照会・削除請求**:  
   親権者が、当社が保有する未成年者の個人情報について照会・訂正・削除を希望する場合は、前条の「開示等」の手続きに従ってご連絡ください。当社は必要に応じて年齢確認や委任状の提出を求め、正当な請求であることを確認した上で対応します。

4. **利用規約との整合性**:  
   未成年者が当社サービスを利用する場合は、プライバシーポリシーに加えて、サービスの利用規約に定められた年齢制限や制約事項なども遵守する必要があります。もし利用規約に違反していると判明した場合は、アカウント停止などの措置が取られることがあります。


第11条(プライバシーポリシーの変更)
当社は、必要に応じて本ポリシーの内容を改訂する場合があります。改訂を行う場合は、当社ウェブサイト上にて改訂内容を告知するとともに、重要な変更がある場合はユーザーにメールやサービス内通知等の適切な方法で通知します。

1. **改訂の周知方法**:  
   軽微な変更の場合はウェブサイト上への掲載をもって周知とし、大幅な変更がある場合はメールやポップアップ通知など分かりやすい方法でユーザーに案内します。ユーザーが改訂後に当社サービスを利用した場合、改訂内容に同意したものとみなします。

2. **同意取得が必要な場合**:  
   法令によりユーザーの追加的な同意が必要とされる変更(たとえば、利用目的の大幅な拡張や第三者提供範囲の拡大など)がある場合には、ユーザーからの個別同意を取得するなど適切な手続きを行います。ユーザーが同意しない場合は、改訂されたポリシーに基づくサービス利用が制限される可能性があります。

3. **利用規約との整合性**:  
   本ポリシーと利用規約その他当社の規程が抵触する場合には、各規程の趣旨や法令の解釈を踏まえて総合的に判断し、ユーザーの権利保護と当社サービスの適正な運営を両立すべく対応します。必要に応じて、関連する諸規程も同時に改訂することがあります。


第12条(問い合わせ窓口)
本ポリシーの内容や個人情報の取り扱いに関してご質問やご不明点がある場合、または開示等の請求をされる場合には、以下の窓口までご連絡ください。

- 住所: 〒XXX-XXXX 東京都○○区○○町1-2-3 ○○ビル5F  
- Eメール: privacy@example.com  
- 電話番号: 03-XXXX-YYYY(受付時間 平日10:00~17:00)  

なお、個人情報に関する問い合わせの際には、ご本人であることを確認させていただく場合があります。確認ができない場合や、代理人による申請の場合は委任状等の書類が必要となることがあります。また、当社が提供する複数のサービスに共通するご要望に関しても、原則として上記の窓口へお問い合わせいただければ、一括して対応いたします。

当社は、今後もユーザーのプライバシーを最優先に考え、安全で信頼性の高いサービスを継続的に提供できるよう努めます。ユーザーが安心して当社サービスを利用できるよう、引き続き適切な個人情報の保護措置を講じ、社会的責任を果たしてまいります。さらに、新しい技術やサービスを導入する際にも、プライバシーリスクを十分に評価し、必要な保護措置を検討・実装することをお約束いたします。

以上が、当社の策定するプライバシーポリシー(大幅加筆版)の全文となります。  

まず今回の記事ではローカルのDBに格納することを考えます。
今回利用したのはChroma DBになります。

Chroma DBはLangChainにラッパーが用意されているので、LangChainから簡単に利用できます。
また、このDBがGoogle Cloudのものに変わったとしても、ラッパーするパッケージやクラスが変わるだけなので、「比較的簡単に」DBに関しては、入れ替えることができます。

実行結果

実行することで、下記のような結果が出力されると思います。

出力結果

Documents(3件): ['第1条(総則・目的)\n当社(以下「当社」といいます)は、ユーザーの皆様(以下「ユーザー」といいます)から取得する個人情報を適切に取り扱うことを社会的責務と認識し、本プライバシーポリシー(以下「本ポリシー」といいます)を策定いたしました。本ポリシーは、ユーザーが当社のサービスまたはウェブサイト(以下「当社サービス」といいます)を利用するにあたり、当社がどのような情報を収集し、どのように利用・管理し、どのような安全対策を講じるかを明確にし、ユーザーが安心して当社サービスを利用できるようにすることを目的としています。\n\n当社は、日本国の個人情報保護法(個人情報の保護に関する法律)および関連するガイドライン、並びにGDPR(EU一般データ保護規則)その他各国の法令を遵守します。また、本ポリシーは当社ウェブサイト上にて常に閲覧可能な形で公開されており、ユーザーが当社サービスを利用した時点で本ポリシーの内容に同意したものとみなされます。もし本ポリシーの内容に同意いただけない場合は、恐れ入りますが当社サービスのご利用をお控えください。', '当社は個人情報を大切な社会資源と捉え、その管理と保護を重要な責務として認識しております。ユーザーの個人情報を取り扱う際には、本ポリシーに則り、十分なセキュリティ対策のもと慎重に対応いたします。さらに、内部監査や従業員教育など組織的な取り組みを強化し、個人情報保護の重要性を改めて共有しています。万が一、漏洩事故や不正アクセスなどのリスクが顕在化した場合には、法令に則り迅速に情報開示と必要な対応を行う体制を整えています。\n\nなお、本ポリシーは状況の変化や法令の改正などに伴って改訂される場合があります。最新の内容を確認されたい場合は、当社ウェブサイト内に掲載している最新版のプライバシーポリシーをご覧ください。当社が本ポリシーの変更を行う場合、重要な改訂点があるときにはユーザーに対して適切な方法で通知を行います。', '当社はユーザーの同意を得た場合、または法令等に基づき正当な理由がある場合にのみ、ユーザーの個人情報を第三者へ提供または開示します。これはユーザーが自身の情報がどのようなタイミングで第三者に渡るのかを明確に理解するための重要な指針でもあります。当社は「個人情報の保護と有効活用の両立」を基本理念に掲げ、ユーザーが安心してサービスを活用できる環境づくりを目指してまいります。\n\nさらに、当社は個人情報保護だけでなく、情報セキュリティの強化や適切なリスクマネジメントの推進にも力を入れています。具体的には、システムへのアクセス権限の厳格な制御、監査ログの取得や分析の実施、スタッフの研修など、多岐にわたる取り組みを行っています。また、国際的にも高い評価を受けているセキュリティ規格の取得を目指し、継続的な改善活動に取り組んでいます。']
Metadatas(全件): [{'my_metadata': 0}, {'my_metadata': 1}, {'my_metadata': 2}, {'my_metadata': 3}, {'my_metadata': 4}, {'my_metadata': 5}, {'my_metadata': 6}, {'my_metadata': 7}, {'my_metadata': 8}, {'my_metadata': 9}, {'my_metadata': 10}, {'my_metadata': 11}, {'my_metadata': 12}, {'my_metadata': 13}, {'my_metadata': 14}, {'my_metadata': 15}, {'my_metadata': 16}, {'my_metadata': 17}, {'my_metadata': 18}, {'my_metadata': 19}, {'my_metadata': 20}, {'my_metadata': 21}, {'my_metadata': 22}, {'my_metadata': 23}, {'my_metadata': 24}, {'my_metadata': 25}]
Embeddings(一部): [-0.02826498 0.01682604 -0.04673495 -0.01000138 -0.01476396]

3チャンク分のドキュメントの中身の内容と、全件(今回は26チャンク分)のメタデータ、そして最初の1チャンク目のベクトルデータ(768次元中5次元まで)が出力されていれば成功です。

DBに保存された内容から、LLMがRAGで質問に回答する

続いて、DBに格納された情報源を利用して、LLMが回答するコードの部分を実装します。
ドキュメントがダミーのプライバシーポリシーのため、今回のLLM君は、企業のQ&A botとして利用することを想定します。

ここでは、ユーザの質問文を、Embeddingsモデルによって、ベクトルに変換して、そのベクトルとDBに格納されているベクトルとで類似度を計算します。
そして、類似性が高いチャンクをLLMのプロンプトに提示し、その情報をもとにLLMに回答させることがゴールです。

LangChainを利用して実装するため、推奨されているLCEL記法を使って、Chainとして全部繋げて実行できることを目的にします。

実行結果

本コードを実行すると、下記のような出力が得られます。

出力結果

===== DenseRetriever の実行結果 =====

DenseRetrieved Documents: [Document(id='i_23', metadata={'my_metadata': 22}, page_content='2. 未成年者の個人情報保護: \n 16歳未満の利用者の個人情報に関しては、一般のユーザーと同等のセキュリティ対策を講じていますが、必要に応じてより厳格なアクセス制限を設定する場合があります。たとえば、投稿やコミュニケーション機能を制限したり、年齢に応じたコンテンツ表示のフィルタリングを行うことが検討されます。\n\n3. 照会・削除請求: \n 親権者が、当社が保有する未成年者の個人情報について照会・訂正・削除を希望する場合は、前条の「開示等」の手続きに従ってご連絡ください。当社は必要に応じて年齢確認や委任状の提出を求め、正当な請求であることを確認した上で対応します。\n\n4. 利用規約との整合性: \n 未成年者が当社サービスを利用する場合は、プライバシーポリシーに加えて、サービスの利用規約に定められた年齢制限や制約事項なども遵守する必要があります。もし利用規約に違反していると判明した場合は、アカウント停止などの措置が取られることがあります。'), Document(id='i_22', metadata={'my_metadata': 21}, page_content='4. 手数料: \n 開示等の手数料については、当社が別途定める方法により請求させていただく場合がありますので、あらかじめご了承ください。\n\n上記のように、当社はユーザーの権利を尊重し、迅速かつ誠実な対応に努めます。ただし、請求内容によっては相当の期間や追加資料を要する場合があります。その際には手続きの進捗状況や必要な対応を速やかにユーザーへ連絡します。\n\n\n第10条(未成年者の個人情報)\n当社は、16歳未満のユーザーが当社サービスを利用する場合、法定代理人(親権者等)の同意を得ることが必要である場合があると認識しています。ユーザーが未成年者であるにもかかわらず同意を得ていない場合、もしくは未成年者である旨を偽って利用登録を行った場合には、当社は一切の責任を負いかねます。\n\n1. 親権者の同意取得: \n 未成年者がサービスを利用するにあたっては、親権者が本ポリシーの内容を確認したうえで利用に同意することが望ましいと考えています。特に決済手段の登録や外部サービスとの連携など、リスクの高い行為については慎重な対応を求めています。'), Document(id='i_24', metadata={'my_metadata': 23}, page_content='第11条(プライバシーポリシーの変更)\n当社は、必要に応じて本ポリシーの内容を改訂する場合があります。改訂を行う場合は、当社ウェブサイト上にて改訂内容を告知するとともに、重要な変更がある場合はユーザーにメールやサービス内通知等の適切な方法で通知します。\n\n1. 改訂の周知方法: \n 軽微な変更の場合はウェブサイト上への掲載をもって周知とし、大幅な変更がある場合はメールやポップアップ通知など分かりやすい方法でユーザーに案内します。ユーザーが改訂後に当社サービスを利用した場合、改訂内容に同意したものとみなします。\n\n2. 同意取得が必要な場合: \n 法令によりユーザーの追加的な同意が必要とされる変更(たとえば、利用目的の大幅な拡張や第三者提供範囲の拡大など)がある場合には、ユーザーからの個別同意を取得するなど適切な手続きを行います。ユーザーが同意しない場合は、改訂されたポリシーに基づくサービス利用が制限される可能性があります。'), Document(id='i_20', metadata={'my_metadata': 19}, page_content='4. ユーザーへの周知: \n 国際データ移転がサービス提供上不可避である場合、当社は利用規約や本ポリシーにてその旨を周知し、ユーザーがそのリスクや対策内容を理解できるよう配慮します。ユーザーが海外でサービスを利用する際には、各国の法規制やインターネットインフラ状況を踏まえて、データがどのように移転・保護されるのかを検討する必要があります。\n\n\n第9条(保有個人情報の開示・訂正・削除)\nユーザーは、当社が保有しているユーザー自身の個人情報について、開示、訂正、追加、削除、利用停止、または第三者提供の停止(以下「開示等」と総称)を請求する権利を有します。当社は、ユーザーからの開示等に関する請求があった場合、法令に基づき合理的な範囲で対応します。請求を希望される場合は、当社所定の手続き(本人確認等)を経たうえで、当社カスタマーサポートまでご連絡ください。'), Document(id='i_26', metadata={'my_metadata': 25}, page_content='なお、個人情報に関する問い合わせの際には、ご本人であることを確認させていただく場合があります。確認ができない場合や、代理人による申請の場合は委任状等の書類が必要となることがあります。また、当社が提供する複数のサービスに共通するご要望に関しても、原則として上記の窓口へお問い合わせいただければ、一括して対応いたします。\n\n当社は、今後もユーザーのプライバシーを最優先に考え、安全で信頼性の高いサービスを継続的に提供できるよう努めます。ユーザーが安心して当社サービスを利用できるよう、引き続き適切な個人情報の保護措置を講じ、社会的責任を果たしてまいります。さらに、新しい技術やサービスを導入する際にも、プライバシーリスクを十分に評価し、必要な保護措置を検討・実装することをお約束いたします。\n\n以上が、当社の策定するプライバシーポリシー(大幅加筆版)の全文となります。')]

================= LLMの実行結果 =================
16歳未満のユーザーが当社のサービスを利用する場合、法定代理人(親権者等)の同意を得ることが必要である場合があると認識しています。ユーザーが未成年者であるにもかかわらず同意を得ていない場合、もしくは未成年者である旨を偽って利用登録を行った場合には、当社は一切の責任を負いかねます。(情報源:i_22)

また、国際データ移転がサービス提供上不可避である場合、当社は利用規約やプライバシーポリシーにてその旨を周知し、ユーザーがそのリスクや対策内容を理解できるよう配慮します。ユーザーが海外でサービスを利用する際には、各国の法規制やインターネットインフラ状況を踏まえて、データがどのように移転・保護されるのかを検討する必要があります。(情報源:i_20)

未成年者の個人情報に関しては、一般のユーザーと同等のセキュリティ対策を講じていますが、必要に応じてより厳格なアクセス制限を設定する場合があります。たとえば、投稿やコミュニケーション機能を制限したり、年齢に応じたコンテンツ表示のフィルタリングを行うことが検討されます。(情報源:i_23)

最終的な出力結果を見ると、ちゃんと複数のドキュメントに跨った質問に対して、ちゃんと回答できていることがわかります。

ちなみに想定される回答は下記でした。

想定回答

想定回答
16歳未満のユーザーがサービスを利用する場合には、第10条の規定により親権者の同意が必要となります。もし同意が得られていない場合は、当社は責任を負いかねるとしています。また、海外からの利用であるため、ユーザーのデータが国際データ移転の対象となる場合があります。これに関しては第8条で規定されており、必要に応じてEU標準契約条項などの締結や暗号化を行う形でデータの保護が図られます。つまり、親権者の同意がない場合はアカウント停止や責任の免除が行われる可能性がある一方で、データそのものが国外サーバーに保存される際にはプライバシー保護のための措置が適用される仕組みになっています。

根拠の箇所
第10条(未成年者の個人情報)
「16歳未満のユーザーが当社サービスを利用する場合、法定代理人(親権者等)の同意を得ることが必要... 同意を得ずに登録された場合...当社は一切の責任を負いかねます。」

第8条(国際データ移転)
「...移転先の国や地域における個人情報保護法制が日本またはEUなどの基準と同等以上の水準にあるかどうかを確認し、必要に応じて適切な契約を締結するなどの対応を取る...」

Agentsを利用して、DBに保存された内容から、LLMがRAGで質問に回答する

ここまでの課題

ここまででも十分にRAGの実装はできていると思いますが、現在の実装では、雑談を振られた時でもRAGが実行されてしまいます。
つまり、挨拶をされた時も、そのクエリと類似するプライバシーポリシーの内容を取得して、回答してしまうわけです。

もちろんgeminiは賢いので、ただの挨拶にRAGの情報がプロンプトに埋め込まれていたとしても、回答に違和感はありません。

例えば、「おはよう」と入力した結果を見てみます。

出力結果

===== DenseRetriever の実行結果 =====

DenseRetrieved Documents: [Document(id='i_2', metadata={'my_metadata': 1}, page_content='当社は個人情報を大切な社会資源と捉え、その管理と保護を重要な責務として認識しております。ユーザーの個人情報を取り扱う際には、本ポリシーに則り、十分なセキュリティ対策のもと慎重に対応いたします。さらに、内部監査や従業員教育など組織的な取り組みを強化し、個人情報保護の重要性を改めて共有しています。万が一、漏洩事故や不正アクセスなどのリスクが顕在化した場合には、法令に則り迅速に情報開示と必要な対応を行う体制を整えています。\n\nなお、本ポリシーは状況の変化や法令の改正などに伴って改訂される場合があります。最新の内容を確認されたい場合は、当社ウェブサイト内に掲載している最新版のプライバシーポリシーをご覧ください。当社が本ポリシーの変更を行う場合、重要な改訂点があるときにはユーザーに対して適切な方法で通知を行います。'), Document(id='i_3', metadata={'my_metadata': 2}, page_content='当社はユーザーの同意を得た場合、または法令等に基づき正当な理由がある場合にのみ、ユーザーの個人情報を第三者へ提供または開示します。これはユーザーが自身の情報がどのようなタイミングで第三者に渡るのかを明確に理解するための重要な指針でもあります。当社は「個人情報の保護と有効活用の両立」を基本理念に掲げ、ユーザーが安心してサービスを活用できる環境づくりを目指してまいります。\n\nさらに、当社は個人情報保護だけでなく、情報セキュリティの強化や適切なリスクマネジメントの推進にも力を入れています。具体的には、システムへのアクセス権限の厳格な制御、監査ログの取得や分析の実施、スタッフの研修など、多岐にわたる取り組みを行っています。また、国際的にも高い評価を受けているセキュリティ規格の取得を目指し、継続的な改善活動に取り組んでいます。'), Document(id='i_26', metadata={'my_metadata': 25}, page_content='なお、個人情報に関する問い合わせの際には、ご本人であることを確認させていただく場合があります。確認ができない場合や、代理人による申請の場合は委任状等の書類が必要となることがあります。また、当社が提供する複数のサービスに共通するご要望に関しても、原則として上記の窓口へお問い合わせいただければ、一括して対応いたします。\n\n当社は、今後もユーザーのプライバシーを最優先に考え、安全で信頼性の高いサービスを継続的に提供できるよう努めます。ユーザーが安心して当社サービスを利用できるよう、引き続き適切な個人情報の保護措置を講じ、社会的責任を果たしてまいります。さらに、新しい技術やサービスを導入する際にも、プライバシーリスクを十分に評価し、必要な保護措置を検討・実装することをお約束いたします。\n\n以上が、当社の策定するプライバシーポリシー(大幅加筆版)の全文となります。'), Document(id='i_21', metadata={'my_metadata': 20}, page_content='1. 開示の請求: \n 当社が保有する個人情報の種類や利用目的、第三者提供の状況などを開示します。ただし、他のユーザーや第三者の権利利益を害するおそれがある場合、または当社の業務運営に著しい支障をきたすおそれがある場合には、一部情報を非開示とすることがあります。\n\n2. 訂正・追加・削除の請求: \n ユーザーが当社保有の個人情報について誤りがあると認識した場合、訂正や追加を請求できます。また、利用目的に照らして必要がない情報については削除を請求できます。法令上保存義務のある情報については削除できない場合がありますが、その場合は理由と保存期間をユーザーに説明します。\n\n3. 利用停止・第三者提供の停止: \n 当社による個人情報の利用が不適切または法令違反であると判断される場合、ユーザーは利用停止や第三者提供の停止を請求できます。当社は、請求内容を精査し、法令に則った対応を講じます。\n\n4. 手数料: \n 開示等の手数料については、当社が別途定める方法により請求させていただく場合がありますので、あらかじめご了承ください。'), Document(id='i_14', metadata={'my_metadata': 13}, page_content='4. 従業員教育と内部統制: \n プライバシー保護や情報セキュリティに関する社内研修を定期的に実施し、全従業員が最新の脅威や対策方法を理解するよう努めています。さらに、セキュリティポリシーを遵守しない行為に対しては懲戒制度も設け、組織的な内部統制を行っています。\n\n5. 委託先の監督: \n 個人情報の取り扱いを外部企業へ委託する場合には、委託先との契約により適切な安全管理水準を義務付け、定期的にその実施状況を確認します。必要に応じて改善要請を行うなど、委託先が当社の基準を満たすように管理しています。\n\n当社は、万が一、個人情報が漏洩または不正利用された場合には、速やかに事実関係を特定し、被害の拡大を防止するための措置を講じるとともに、関係当局への報告やユーザーへの通知を行うなど、適切な対応を実施します。また、再発防止策を立案・実施することで、同様のリスクが再び生じないように努めます。')]

================= LLMの実行結果 =================
おはようございます!何かお手伝いできることはありますか?弊社のサービスについてのご質問や、プライバシーポリシーについて知りたいことなど、何でもお気軽にお尋ねください。

このくらいなら、問題ないですね。
RAG自体は動いていますが、ちゃんと挨拶であると判断して余計な情報を出していないところは評価できます。

では、もう少しレベルと上げて、
「今日は12歳の誕生日なんだ。これから初めて海外に行くんだよね」
と聞いてみます。

出力結果

===== DenseRetriever の実行結果 =====

DenseRetrieved Documents: [Document(id='i_24', metadata={'my_metadata': 23}, page_content='第11条(プライバシーポリシーの変更)\n当社は、必要に応じて本ポリシーの内容を改訂する場合があります。改訂を行う場合は、当社ウェブサイト上にて改訂内容を告知するとともに、重要な変更がある場合はユーザーにメールやサービス内通知等の適切な方法で通知します。\n\n1. 改訂の周知方法: \n 軽微な変更の場合はウェブサイト上への掲載をもって周知とし、大幅な変更がある場合はメールやポップアップ通知など分かりやすい方法でユーザーに案内します。ユーザーが改訂後に当社サービスを利用した場合、改訂内容に同意したものとみなします。\n\n2. 同意取得が必要な場合: \n 法令によりユーザーの追加的な同意が必要とされる変更(たとえば、利用目的の大幅な拡張や第三者提供範囲の拡大など)がある場合には、ユーザーからの個別同意を取得するなど適切な手続きを行います。ユーザーが同意しない場合は、改訂されたポリシーに基づくサービス利用が制限される可能性があります。'), Document(id='i_23', metadata={'my_metadata': 22}, page_content='2. 未成年者の個人情報保護: \n 16歳未満の利用者の個人情報に関しては、一般のユーザーと同等のセキュリティ対策を講じていますが、必要に応じてより厳格なアクセス制限を設定する場合があります。たとえば、投稿やコミュニケーション機能を制限したり、年齢に応じたコンテンツ表示のフィルタリングを行うことが検討されます。\n\n3. 照会・削除請求: \n 親権者が、当社が保有する未成年者の個人情報について照会・訂正・削除を希望する場合は、前条の「開示等」の手続きに従ってご連絡ください。当社は必要に応じて年齢確認や委任状の提出を求め、正当な請求であることを確認した上で対応します。\n\n4. 利用規約との整合性: \n 未成年者が当社サービスを利用する場合は、プライバシーポリシーに加えて、サービスの利用規約に定められた年齢制限や制約事項なども遵守する必要があります。もし利用規約に違反していると判明した場合は、アカウント停止などの措置が取られることがあります。'), Document(id='i_22', metadata={'my_metadata': 21}, page_content='4. 手数料: \n 開示等の手数料については、当社が別途定める方法により請求させていただく場合がありますので、あらかじめご了承ください。\n\n上記のように、当社はユーザーの権利を尊重し、迅速かつ誠実な対応に努めます。ただし、請求内容によっては相当の期間や追加資料を要する場合があります。その際には手続きの進捗状況や必要な対応を速やかにユーザーへ連絡します。\n\n\n第10条(未成年者の個人情報)\n当社は、16歳未満のユーザーが当社サービスを利用する場合、法定代理人(親権者等)の同意を得ることが必要である場合があると認識しています。ユーザーが未成年者であるにもかかわらず同意を得ていない場合、もしくは未成年者である旨を偽って利用登録を行った場合には、当社は一切の責任を負いかねます。\n\n1. 親権者の同意取得: \n 未成年者がサービスを利用するにあたっては、親権者が本ポリシーの内容を確認したうえで利用に同意することが望ましいと考えています。特に決済手段の登録や外部サービスとの連携など、リスクの高い行為については慎重な対応を求めています。'), Document(id='i_20', metadata={'my_metadata': 19}, page_content='4. ユーザーへの周知: \n 国際データ移転がサービス提供上不可避である場合、当社は利用規約や本ポリシーにてその旨を周知し、ユーザーがそのリスクや対策内容を理解できるよう配慮します。ユーザーが海外でサービスを利用する際には、各国の法規制やインターネットインフラ状況を踏まえて、データがどのように移転・保護されるのかを検討する必要があります。\n\n\n第9条(保有個人情報の開示・訂正・削除)\nユーザーは、当社が保有しているユーザー自身の個人情報について、開示、訂正、追加、削除、利用停止、または第三者提供の停止(以下「開示等」と総称)を請求する権利を有します。当社は、ユーザーからの開示等に関する請求があった場合、法令に基づき合理的な範囲で対応します。請求を希望される場合は、当社所定の手続き(本人確認等)を経たうえで、当社カスタマーサポートまでご連絡ください。'), Document(id='i_12', metadata={'my_metadata': 11}, page_content='6. 法令上必要な対応: \n 裁判所や警察などの公的機関から法的に有効な開示請求があった場合、または法令で認められるその他の手続きを遂行するために情報を利用することがあります。例えば、捜査協力においてログデータの開示が求められた場合には、関係法令に基づき適切に対応いたします。\n\nこれらの目的以外で個人情報を利用する場合には、事前にユーザーの同意を得るか、もしくは当該利用が法令で許容される場合に限り行います。利用目的の大幅な変更が生じる場合には、当社ウェブサイト上やメール等で通知を行い、必要に応じて改めてユーザーの同意を取得します。こうした手続きを通じて、ユーザーの意に反してデータが用いられないよう配慮しています。\n\n\n第5条(個人情報の管理と安全対策)\n当社は、ユーザーの個人情報を正確かつ最新の状態に保つよう努めるとともに、不正アクセス、漏洩、改ざん、滅失等のリスクを軽減するため、適切な技術的および組織的安全管理措置を講じます。具体的には以下のようなセキュリティ対策を実施しています。')]

================= LLMの実行結果 =================
12歳のお誕生日おめでとうございます!🎉 初めての海外旅行、わくわくしますね!

株式会社asapのサービスをご利用いただきありがとうございます。
16歳未満の方が当社のサービスをご利用になる場合、法定代理人(親権者等)の同意を得ることが必要となる場合があります。
特に決済手段の登録や外部サービスとの連携など、リスクの高い行為については慎重な対応をお願いしております。

楽しい海外旅行になりますように!

うーん。良くないわけではないですが。。。
普通に雑談しているだけなのに、急にサービスの内容に食い込んできてしまっていますね。

Xとかでよくある、AIでリプライしてくるやつみたいですね。急にサービスに誘導しようとしてくるやつ。あれ無くなればいいのに。

こうなっている原因は一つで、毎回の実行のたびに必ずRAGが呼ばれていることに起因します。
プライバシーポリシーについて聞かれていない、雑談の部分ではRAGは実行しないでほしいと言うのが理想ですね。
毎回RAGが実行されると、雑談に対してもサービスの説明を割り込ませるよくないbotになってしまいます。

そこで、Agentを実装することにします。
そうすることで、ドキュメントの検索をする前に、そもそもドキュメントの検索の必要性をLLMが判断してくれるようになります。
そうすることで、雑談は雑談として、サービスへの質問はサービスへの質問として、どちらも適切に回答してくれるようになることを期待します。

実行結果

さて、ではAgentにしたと言うことで、その結果を見てみましょう。

まずは、ユーザクエリが下記の場合です。
「16歳未満のユーザーが海外から当社サービスを利用した場合、親権者が同意していないときはどう扱われますか? そのときデータは国外にも保存される可能性がありますか?」

(最終的な出力結果は下の方にあります。結果だけ見たい方は下の方にスクロールしてください)

出力結果

================= エージェントの実行結果 =================

=== Message 0 ===
Type: HumanMessage
Content:
16歳未満のユーザーが海外から当社サービスを利用した場合、親権者が同意していないときはどう扱われますか? そのときデータは国外にも保存される可能性がありますか?

=== Message 1 ===
Type: AIMessage
Content:

Tool calls:
[{'name': 'Document_Search_Tool', 'args': {'__arg1': '16歳未満のユーザーが海外から当社サービスを利用した場合、親権者が同意していないとき'}, 'id': '2ceb9a8a-e74d-4af6-a4bc-11990a0c16af', 'type': 'tool_call'}, {'name': 'Document_Search_Tool', 'args': {'__arg1': 'データは国外にも保存される可能性'}, 'id': 'e372f826-e2a5-463e-a358-14dc31c13e77', 'type': 'tool_call'}]
Response Metadata:
{'prompt_feedback': {'block_reason': 0, 'safety_ratings': []}, 'finish_reason': 'STOP', 'safety_ratings': []}

=== Message 2 ===
Type: ToolMessage
Content:
[Document(id='i_23', metadata={'my_metadata': 22}, page_content='2. 未成年者の個人情報保護: \n 16歳未満の利用者の個人情報に関しては、一般のユーザーと同等のセキュリティ対策を講じていますが、必要に応じてより厳格なアクセス制限を設定する場合があります。たとえば、投稿やコミュニケーション機能を制限したり、年齢に応じたコンテンツ表示のフィルタリングを行うことが検討されます。\n\n3. 照会・削除請求: \n 親権者が、当社が保有する未成年者の個人情報について照会・訂正・削除を希望する場合は、前条の「開示等」の手続きに従ってご連絡ください。当社は必要に応じて年齢確認や委任状の提出を求め、正当な請求であることを確認した上で対応します。\n\n4. 利用規約との整合性: \n 未成年者が当社サービスを利用する場合は、プライバシーポリシーに加えて、サービスの利用規約に定められた年齢制限や制約事項なども遵守する必要があります。もし利用規約に違反していると判明した場合は、アカウント停止などの措置が取られることがあります。'), Document(id='i_22', metadata={'my_metadata': 21}, page_content='4. 手数料: \n 開示等の手数料については、当社が別途定める方法により請求させていただく場合がありますので、あらかじめご了承ください。\n\n上記のように、当社はユーザーの権利を尊重し、迅速かつ誠実な対応に努めます。ただし、請求内容によっては相当の期間や追加資料を要する場合があります。その際には手続きの進捗状況や必要な対応を速やかにユーザーへ連絡します。\n\n\n第10条(未成年者の個人情報)\n当社は、16歳未満のユーザーが当社サービスを利用する場合、法定代理人(親権者等)の同意を得ることが必要である場合があると認識しています。ユーザーが未成年者であるにもかかわらず同意を得ていない場合、もしくは未成年者である旨を偽って利用登録を行った場合には、当社は一切の責任を負いかねます。\n\n1. 親権者の同意取得: \n 未成年者がサービスを利用するにあたっては、親権者が本ポリシーの内容を確認したうえで利用に同意することが望ましいと考えています。特に決済手段の登録や外部サービスとの連携など、リスクの高い行為については慎重な対応を求めています。'), Document(id='i_20', metadata={'my_metadata': 19}, page_content='4. ユーザーへの周知: \n 国際データ移転がサービス提供上不可避である場合、当社は利用規約や本ポリシーにてその旨を周知し、ユーザーがそのリスクや対策内容を理解できるよう配慮します。ユーザーが海外でサービスを利用する際には、各国の法規制やインターネットインフラ状況を踏まえて、データがどのように移転・保護されるのかを検討する必要があります。\n\n\n第9条(保有個人情報の開示・訂正・削除)\nユーザーは、当社が保有しているユーザー自身の個人情報について、開示、訂正、追加、削除、利用停止、または第三者提供の停止(以下「開示等」と総称)を請求する権利を有します。当社は、ユーザーからの開示等に関する請求があった場合、法令に基づき合理的な範囲で対応します。請求を希望される場合は、当社所定の手続き(本人確認等)を経たうえで、当社カスタマーサポートまでご連絡ください。'), Document(id='i_12', metadata={'my_metadata': 11}, page_content='6. 法令上必要な対応: \n 裁判所や警察などの公的機関から法的に有効な開示請求があった場合、または法令で認められるその他の手続きを遂行するために情報を利用することがあります。例えば、捜査協力においてログデータの開示が求められた場合には、関係法令に基づき適切に対応いたします。\n\nこれらの目的以外で個人情報を利用する場合には、事前にユーザーの同意を得るか、もしくは当該利用が法令で許容される場合に限り行います。利用目的の大幅な変更が生じる場合には、当社ウェブサイト上やメール等で通知を行い、必要に応じて改めてユーザーの同意を取得します。こうした手続きを通じて、ユーザーの意に反してデータが用いられないよう配慮しています。\n\n\n第5条(個人情報の管理と安全対策)\n当社は、ユーザーの個人情報を正確かつ最新の状態に保つよう努めるとともに、不正アクセス、漏洩、改ざん、滅失等のリスクを軽減するため、適切な技術的および組織的安全管理措置を講じます。具体的には以下のようなセキュリティ対策を実施しています。'), Document(id='i_26', metadata={'my_metadata': 25}, page_content='なお、個人情報に関する問い合わせの際には、ご本人であることを確認させていただく場合があります。確認ができない場合や、代理人による申請の場合は委任状等の書類が必要となることがあります。また、当社が提供する複数のサービスに共通するご要望に関しても、原則として上記の窓口へお問い合わせいただければ、一括して対応いたします。\n\n当社は、今後もユーザーのプライバシーを最優先に考え、安全で信頼性の高いサービスを継続的に提供できるよう努めます。ユーザーが安心して当社サービスを利用できるよう、引き続き適切な個人情報の保護措置を講じ、社会的責任を果たしてまいります。さらに、新しい技術やサービスを導入する際にも、プライバシーリスクを十分に評価し、必要な保護措置を検討・実装することをお約束いたします。\n\n以上が、当社の策定するプライバシーポリシー(大幅加筆版)の全文となります。')]
Tool name: Document_Search_Tool

=== Message 3 ===
Type: ToolMessage
Content:
[Document(id='i_2', metadata={'my_metadata': 1}, page_content='当社は個人情報を大切な社会資源と捉え、その管理と保護を重要な責務として認識しております。ユーザーの個人情報を取り扱う際には、本ポリシーに則り、十分なセキュリティ対策のもと慎重に対応いたします。さらに、内部監査や従業員教育など組織的な取り組みを強化し、個人情報保護の重要性を改めて共有しています。万が一、漏洩事故や不正アクセスなどのリスクが顕在化した場合には、法令に則り迅速に情報開示と必要な対応を行う体制を整えています。\n\nなお、本ポリシーは状況の変化や法令の改正などに伴って改訂される場合があります。最新の内容を確認されたい場合は、当社ウェブサイト内に掲載している最新版のプライバシーポリシーをご覧ください。当社が本ポリシーの変更を行う場合、重要な改訂点があるときにはユーザーに対して適切な方法で通知を行います。'), Document(id='i_3', metadata={'my_metadata': 2}, page_content='当社はユーザーの同意を得た場合、または法令等に基づき正当な理由がある場合にのみ、ユーザーの個人情報を第三者へ提供または開示します。これはユーザーが自身の情報がどのようなタイミングで第三者に渡るのかを明確に理解するための重要な指針でもあります。当社は「個人情報の保護と有効活用の両立」を基本理念に掲げ、ユーザーが安心してサービスを活用できる環境づくりを目指してまいります。\n\nさらに、当社は個人情報保護だけでなく、情報セキュリティの強化や適切なリスクマネジメントの推進にも力を入れています。具体的には、システムへのアクセス権限の厳格な制御、監査ログの取得や分析の実施、スタッフの研修など、多岐にわたる取り組みを行っています。また、国際的にも高い評価を受けているセキュリティ規格の取得を目指し、継続的な改善活動に取り組んでいます。'), Document(id='i_26', metadata={'my_metadata': 25}, page_content='なお、個人情報に関する問い合わせの際には、ご本人であることを確認させていただく場合があります。確認ができない場合や、代理人による申請の場合は委任状等の書類が必要となることがあります。また、当社が提供する複数のサービスに共通するご要望に関しても、原則として上記の窓口へお問い合わせいただければ、一括して対応いたします。\n\n当社は、今後もユーザーのプライバシーを最優先に考え、安全で信頼性の高いサービスを継続的に提供できるよう努めます。ユーザーが安心して当社サービスを利用できるよう、引き続き適切な個人情報の保護措置を講じ、社会的責任を果たしてまいります。さらに、新しい技術やサービスを導入する際にも、プライバシーリスクを十分に評価し、必要な保護措置を検討・実装することをお約束いたします。\n\n以上が、当社の策定するプライバシーポリシー(大幅加筆版)の全文となります。'), Document(id='i_21', metadata={'my_metadata': 20}, page_content='1. 開示の請求: \n 当社が保有する個人情報の種類や利用目的、第三者提供の状況などを開示します。ただし、他のユーザーや第三者の権利利益を害するおそれがある場合、または当社の業務運営に著しい支障をきたすおそれがある場合には、一部情報を非開示とすることがあります。\n\n2. 訂正・追加・削除の請求: \n ユーザーが当社保有の個人情報について誤りがあると認識した場合、訂正や追加を請求できます。また、利用目的に照らして必要がない情報については削除を請求できます。法令上保存義務のある情報については削除できない場合がありますが、その場合は理由と保存期間をユーザーに説明します。\n\n3. 利用停止・第三者提供の停止: \n 当社による個人情報の利用が不適切または法令違反であると判断される場合、ユーザーは利用停止や第三者提供の停止を請求できます。当社は、請求内容を精査し、法令に則った対応を講じます。\n\n4. 手数料: \n 開示等の手数料については、当社が別途定める方法により請求させていただく場合がありますので、あらかじめご了承ください。'), Document(id='i_14', metadata={'my_metadata': 13}, page_content='4. 従業員教育と内部統制: \n プライバシー保護や情報セキュリティに関する社内研修を定期的に実施し、全従業員が最新の脅威や対策方法を理解するよう努めています。さらに、セキュリティポリシーを遵守しない行為に対しては懲戒制度も設け、組織的な内部統制を行っています。\n\n5. 委託先の監督: \n 個人情報の取り扱いを外部企業へ委託する場合には、委託先との契約により適切な安全管理水準を義務付け、定期的にその実施状況を確認します。必要に応じて改善要請を行うなど、委託先が当社の基準を満たすように管理しています。\n\n当社は、万が一、個人情報が漏洩または不正利用された場合には、速やかに事実関係を特定し、被害の拡大を防止するための措置を講じるとともに、関係当局への報告やユーザーへの通知を行うなど、適切な対応を実施します。また、再発防止策を立案・実施することで、同様のリスクが再び生じないように努めます。')]
Tool name: Document_Search_Tool

=== Message 4 ===
Type: AIMessage
Content:
16歳未満のユーザーが海外からサービスを利用する場合、親権者の同意がない場合について、当社の規約から関連する情報を以下に示します。

  • 第10条(未成年者の個人情報): 当社は、16歳未満のユーザーが当社サービスを利用する場合、法定代理人(親権者等)の同意を得ることが必要である場合があると認識しています。ユーザーが未成年者であるにもかかわらず同意を得ていない場合、もしくは未成年者である旨を偽って利用登録を行った場合には、当社は一切の責任を負いかねます。
  • 1. 親権者の同意取得: 未成年者がサービスを利用するにあたっては、親権者が本ポリシーの内容を確認したうえで利用に同意することが望ましいと考えています。特に決済手段の登録や外部サービスとの連携など、リスクの高い行為については慎重な対応を求めています。

また、データが国外にも保存される可能性については、以下の情報があります。

  • 4. ユーザーへの周知: 国際データ移転がサービス提供上不可避である場合、当社は利用規約や本ポリシーにてその旨を周知し、ユーザーがそのリスクや対策内容を理解できるよう配慮します。ユーザーが海外でサービスを利用する際には、各国の法規制やインターネットインフラ状況を踏まえて、データがどのように移転・保護されるのかを検討する必要があります。

これらの情報から、16歳未満のユーザーが親権者の同意を得ずにサービスを利用した場合、当社は責任を負いかねること、およびデータが国外にも保存される可能性があることがわかります。
Tool calls:
[]
Response Metadata:
{'prompt_feedback': {'block_reason': 0, 'safety_ratings': []}, 'finish_reason': 'STOP', 'safety_ratings': []}

================= 最終的な出力結果 =================
16歳未満のユーザーが海外からサービスを利用する場合、親権者の同意がない場合について、当社の規約から関連する情報を以下に示します。

  • 第10条(未成年者の個人情報): 当社は、16歳未満のユーザーが当社サービスを利用する場合、法定代理人(親権者等)の同意を得ることが必要である場合があると認識しています。ユーザーが未成年者であるにもかかわらず同意を得ていない場合、もしくは未成年者である旨を偽って利用登録を行った場合には、当社は一切の責任を負いかねます。
  • 1. 親権者の同意取得: 未成年者がサービスを利用するにあたっては、親権者が本ポリシーの内容を確認したうえで利用に同意することが望ましいと考えています。特に決済手段の登録や外部サービスとの連携など、リスクの高い行為については慎重な対応を求めています。

また、データが国外にも保存される可能性については、以下の情報があります。

  • 4. ユーザーへの周知: 国際データ移転がサービス提供上不可避である場合、当社は利用規約や本ポリシーにてその旨を周知し、ユーザーがそのリスクや対策内容を理解できるよう配慮します。ユーザーが海外でサービスを利用する際には、各国の法規制やインターネットインフラ状況を踏まえて、データがどのように移転・保護されるのかを検討する必要があります。

これらの情報から、16歳未満のユーザーが親権者の同意を得ずにサービスを利用した場合、当社は責任を負いかねること、およびデータが国外にも保存される可能性があることがわかります。

最終的な出力結果を見ても、ちゃんとドキュメントを参照して、正しい回答ができているように見えます。

続いて、雑談の場合を見てみましょう。本題はこちらです。

まずは単純な「おはよう」の雑談です。
ユーザクエリとして「おはよう」を入力してみましょう

出力結果

================= エージェントの実行結果 =================

=== Message 0 ===
Type: HumanMessage
Content:
おはよう

=== Message 1 ===
Type: AIMessage
Content:
おはようございます!今日も一日頑張りましょう!何かお手伝いできることはありますか?
Tool calls:
[]
Response Metadata:
{'prompt_feedback': {'block_reason': 0, 'safety_ratings': []}, 'finish_reason': 'STOP', 'safety_ratings': []}

================= 最終的な出力結果 =================
おはようございます!今日も一日頑張りましょう!何かお手伝いできることはありますか?

おお!
雑談の場合は、全くToolが呼ばれなくなりましたね!すごく良いです。返答も早いし。

最後に、先ほどのChain実装ではあまりうまくいかなかった、下記のクエリでも試してみましょう。
「今日は12歳の誕生日なんだ。これから初めて海外に行くんだよね」

出力結果

================= エージェントの実行結果 =================

=== Message 0 ===
Type: HumanMessage
Content:
今日は12歳の誕生日なんだ。これから初めて海外に行くんだよね

=== Message 1 ===
Type: AIMessage
Content:
12歳のお誕生日おめでとうございます!初めての海外旅行、わくわくしますね!どちらに行かれるんですか? 楽しい思い出をたくさん作ってきてくださいね。
Tool calls:
[]
Response Metadata:
{'prompt_feedback': {'block_reason': 0, 'safety_ratings': []}, 'finish_reason': 'STOP', 'safety_ratings': []}

================= 最終的な出力結果 =================
12歳のお誕生日おめでとうございます!初めての海外旅行、わくわくしますね!どちらに行かれるんですか? 楽しい思い出をたくさん作ってきてくださいね。

ここでも、Toolが呼ばれていないため、不自然にサービスの内容に誘導することもなくなりました!
やりたいこと達成です!

まとめ

思ったより長くなってしまいました。
ここまで読んでくださってありがとうございます!

長くなってしまったので、コードの中身の解説に関しては次回にさせてください!
(LangChainでのretrieverクラスのカスタム実装とかに手を出したりしていたら、解説する量が膨れ上がってしまい・・・)

では、次回もぜひご覧ください!

学習書籍

(書籍のリンクはamazonアフィリエイトリンクです)

LangChainとLangGraphによるRAG・AIエージェント[実践]入門
ChatGPT/LangChainによるチャットシステム構築[実践]入門
LangChainを利用することで、あらゆるモデルを統一的なコードで実行できるようになります。
langchainに関しては、こちらの書籍を読めば大体のことはできるようになりますので、おすすめです。
また、現在推奨されているLangGraphでのRAG Agentを構築するcreate_react_agentに関しても説明されておりますし、さらに複雑なAgentsの構築方法やデザイン方法も網羅されており、とても勉強になります!

大規模言語モデル入門
大規模言語モデル入門Ⅱ〜生成型LLMの実装と評価
よく紹介させていただいておりますが、こちらの書籍は、LLMのファインチューニングから、RLHF、RAG、分散学習にかけて、本当に幅広く解説されており、いつも参考にさせていただいております。
今回の記事で紹介したRAGの内容だけでなく、さらにその先であるRAGを前提としてInstruction Tuningについても触れており、とても面白いです。
LLMを取り扱っている方は、とりあえず買っておいても損はないと思います。
さまざまな章、ページで読めば読むほど新しい発見が得られる、スルメのような本だなといつも思っております。

LLMのファインチューニングとRAG ―チャットボット開発による実践
上記2冊の本よりもRAGやファインチューニングに絞って記載されている書籍です。だいぶ平易に書いてあるのでとてもわかりやすいと思いました。
また、本記事の内容ではないですが、RAGを実装する上でキーワード検索を加えたハイブリッド検索を検討することは一般的だと思います。本書はそこにも踏み込んで解説をしています。
また、キーワード検索でよく利用するBM25Retrieverが日本語のドキュメントに利用する際に一工夫がいるところなども紹介されており、使いやすい本だなと思いました。

19

Discussion

ログインするとコメントできます