ゼファーネットのロゴ

Amazon Bedrock のナレッジベースで RAG を創薬に使用する |アマゾン ウェブ サービス

日付:

アマゾンの岩盤 Anthropic、AI21、Meta、Cohere、Stability AI など、Amazon およびサードパーティプロバイダーの幅広いモデルを提供し、テキストと画像の生成、埋め込み、チャット、高レベルのエージェントを含む幅広いユースケースをカバーします。推論やオーケストレーションなど。 Amazon Bedrock のナレッジベース AWS とサードパーティのモデルの両方を使用して、AWS とサードパーティのベクトル ストア上に、パフォーマンスの高いカスタマイズされた取得拡張生成 (RAG) アプリケーションを構築できます。 Amazon Bedrock のナレッジベースは、更新時のデータの差分、ドキュメントのロード、チャンク化、セマンティック埋め込みなど、データとベクター ストアの同期を自動化します。これにより、RAG プロンプトと取得戦略をシームレスにカスタマイズできます。ソースの帰属が提供され、メモリ管理が自動的に処理されます。ナレッジ ベースは完全にサーバーレスであるため、インフラストラクチャを管理する必要はありません。ナレッジ ベースを使用すると、使用したモデル、ベクトル データベース、ストレージに対してのみ料金が発生します。

RAG は、プライベート データの使用と大規模言語モデル (LLM) を組み合わせた一般的な手法です。 RAG は、ユーザーのクエリに基づいてデータ ストア (最も一般的にはベクトル インデックス) から関連ドキュメントを取得する最初のステップから始まります。次に、言語モデルを使用して、取得したドキュメントと元のクエリの両方を考慮して応答を生成します。

この投稿では、創薬ユースケース向けに Amazon Bedrock のナレッジベースを使用して RAG ワークフローを構築する方法を示します。

Amazon Bedrock のナレッジベースの概要

Amazon Bedrock のナレッジベースは、.txt、.docx、.pdf、.csv などを含む幅広い一般的なファイルタイプをサポートしています。プライベート データから効果的に取得できるようにするには、まずこれらのドキュメントを管理可能なチャンクに分割するのが一般的です。ナレッジベースには、ほとんどの場合にうまく機能するデフォルトのチャンク戦略が実装されており、より早く開始できるようになります。さらに制御したい場合は、ナレッジベースを使用して、事前構成されたオプションのセットを通じてチャンキング戦略を制御できます。最大トークン サイズとチャンク間で作成されるオーバーラップの量を制御して、埋め込みに一貫したコンテキストを提供できます。 Amazon Bedrock のナレッジベースは、ユーザーのデータを同期するプロセスを管理します。 Amazon シンプル ストレージ サービス (Amazon S3) バケットを取得し、それをより小さなチャンクに分割し、ベクトル埋め込みを生成し、その埋め込みをベクトルインデックスに保存します。このプロセスには、インテリジェントな比較、スループット、障害管理が伴います。

実行時に、埋め込みモデルを使用してユーザーのクエリをベクトルに変換します。次に、ベクトル インデックスにクエリが実行され、ドキュメント ベクトルとユーザー クエリ ベクトルを比較することで、ユーザーのクエリに類似したドキュメントが検索されます。最後のステップでは、ベクトル インデックスから取得された意味的に類似したドキュメントが、元のユーザー クエリのコンテキストとして追加されます。ユーザーへの応答を生成するとき、意味的に類似した文書が、トレーサビリティのためのソースの帰属とともにテキスト モデルで要求されます。

Amazon Bedrock のナレッジベースは、以下を含む複数のベクトルデータベースをサポートしています。 Amazon OpenSearch サーバーレス, アマゾンオーロラ、Pinecone、および Redis Enterprise Cloud。 Retrieve API と RetrieveAndGenerate API を使用すると、アプリケーションは、異なるベクトル データベースごとに個別の API を学習することなく、統一された標準構文を使用してインデックスを直接クエリできるため、ベクトル ストアに対してカスタム インデックス クエリを作成する必要性が減ります。 Retrieve API は受信クエリを受け取り、それを埋め込みベクトルに変換し、ベクトル データベース レベルで構成されたアルゴリズムを使用してバックエンド ストアにクエリを実行します。 RetrieveAndGenerate API は、Amazon Bedrock が提供するユーザー設定の LLM を使用し、最終的な回答を自然言語で生成します。ネイティブのトレーサビリティ サポートは、質問への回答に使用されるソースについて要求元のアプリケーションに通知します。エンタープライズ実装の場合、ナレッジベースはサポートします AWSキー管理サービス (AWS KMS) 暗号化、 AWS クラウドトレイル 統合など。

次のセクションでは、OpenSearch サーバーレス ベクトル エンジンを支援する Amazon Bedrock のナレッジベースを使用して RAG ワークフローを構築し、創薬ユースケースの非構造化臨床試験データセットを分析する方法を示します。このデータは情報が豊富ですが、非常に異質である可能性があります。洞察を検出し、分析の整合性を確保するには、さまざまな形式の専門用語や概念を適切に処理することが不可欠です。 Amazon Bedrock のナレッジベースを使用すると、シンプルで自然なクエリを通じて詳細情報にアクセスできます。

Amazon Bedrock のナレッジベースを構築する

このセクションでは、コンソールを介して Amazon Bedrock のナレッジベースを作成するプロセスをデモします。次の手順を実行します。

  1. Amazon Bedrock コンソールの次の場所にあります。 編成 ナビゲーション ペインで、 知識ベース.
  2. 選択する 知識ベースを作成する.

  1. ナレッジベースの詳細 セクションで、名前とオプションの説明を入力します。
  2. IAM権限 セクション、選択 新しいサービスロールを作成して使用する.
  3. サービス名の役割、役割の名前を入力します。名前は次で始まる必要があります。 AmazonBedrockExecutionRoleForKnowledgeBase_.
  4. 選択する Next.

  1. 情報元 セクションで、データ ソースの名前とデータセットが存在する S3 URI を入力します。ナレッジベースは次のファイル形式をサポートしています。
    • プレーンテキスト (.txt)
    • マークダウン (.md)
    • ハイパーテキスト マークアップ言語 (.html)
    • Microsoft Word文書(.doc/.docx)
    • カンマ区切り値(.csv)
    • Microsoft Excel スプレッドシート (.xls/.xlsx)
    • ポータブルドキュメントフォーマット(.pdf)
  1. その他の設定¸ 好みのチャンキング戦略を選択します (この投稿では、 固定サイズのチャンク化) を選択し、チャンク サイズとオーバーレイをパーセンテージで指定します。あるいは、デフォルト設定を使用することもできます。
  2. 選択する Next.

  1. 埋め込みモデル セクションで、Amazon Bedrock の Titan Embeddings モデルを選択します。
  2. ベクトルデータベース セクション、選択 新しいベクター ストアを簡単に作成する、ベクター ストアをセットアップするプロセスを管理します。
  3. 選択する Next.

  1. 設定を確認して選択します 知識ベースを作成する.

  1. ナレッジ ベースの作成が完了するまで待ち、ステータスが次であることを確認します。 レディ.
  2. 情報元 セクション、またはページ上部のバナーまたはテスト ウィンドウのポップアップで、選択します。 同期 S3 バケットからデータをロードし、指定したサイズのチャンクに分割し、選択したテキスト埋め込みモデルを使用してベクトル埋め込みを生成し、Amazon Bedrock のナレッジベースによって管理されるベクトルストアに保存するプロセスをトリガーします。

同期機能は、Amazon S3 内のドキュメントへの変更に基づいて、ベクトル インデックスからのドキュメントの取り込み、更新、削除をサポートします。を使用することもできます。 StartIngestionJob AWS SDK 経由で同期をトリガーする API。

同期が完了すると、同期履歴にステータスが表示されます 完了しました。

ナレッジベースに問い合わせる

このセクションでは、簡単で自然なクエリを通じてナレッジ ベースの詳細情報にアクセスする方法を示します。私たちは、各ファイルのページ数が 10 ~ 100 ページの PDF ファイルで構成される非構造化合成データセットを使用し、統計分析方法や参加者の同意書を含む、提案された新薬の臨床試験計画をシミュレートします。 Amazon Bedrock のナレッジベースを使用します retrieve_and_generate & retrieve API と Amazon Bedrock LangChain の統合.

Amazon Bedrock API を使用するスクリプトを作成する前に、環境に適切なバージョンの AWS SDK をインストールする必要があります。 Python スクリプトの場合、これは AWS SDK for Python(Boto3):

pip install langchain
pip install boto3

さらに、Amazon Titan Embeddings モデルおよび Anthropic Claude v2 または v1 へのアクセスを有効にします。詳細については、以下を参照してください。 モデルアクセス.

Amazon Bedrock を使用して質問を生成する

Anthropic Claude 2.1 for Amazon Bedrock を使用して、臨床試験データセットに関して尋ねる質問のリストを提案できます。

import boto3
from langchain.llms.bedrock import Bedrock

bedrock_client = boto3.client("bedrock-runtime")

# Start with the query
prompt = "For medical research trial consent forms to sign, what are the top 5 questions can be asked?"

claude_llm = Bedrock(
    model_id="anthropic.claude-v2:1",
    model_kwargs={"temperature": 0, "top_k": 10, "max_tokens_to_sample": 3000},
    client=bedrock_client,
)

# Provide the prompt to the LLM to generate an answer to the query without any additional context provided
response = claude_llm(prompt)
questions = [
    item.split(".")[1].strip() for item in response.strip().split("nn")[1:-1]
]
questions
>>> answer:
'What is the purpose of the study? Make sure you understand the goals of the research and what the study procedures will entail',
'What are the risks and potential benefits? The form should explain all foreseeable risks, side effects, or discomforts you might experience from participating',
'What will participation involve? Get details on what tests, medications, lifestyle changes, or procedures you will go through, how much time it will take, and how long the study will last',
'Are there any costs or payments? Ask if you will be responsible for any costs related to the study or get paid for participating',
'How will my privacy be protected? The form should explain how your personal health information will be kept confidential before, during, and after the trial'

Amazon Bedrock RetrieveAndGenerate API を使用する

フルマネージドの RAG エクスペリエンスを実現するには、Amazon Bedrock のネイティブ ナレッジベースを使用できます。 RetrieveAndGenerate 回答を直接取得するための API:

bedrock_agent_client = boto3.client("bedrock-agent-runtime")

kb_id = "<YOUR_KNOWLEDGE_BASE_ID>"

def retrieveAndGenerate(
    input: str,
    kbId: str,
    region: str = "us-east-1",
    sessionId: str = None,
    model_id: str = "anthropic.claude-v2:1",
):
    model_arn = f"arn:aws:bedrock:{region}::foundation-model/{model_id}"

    if sessionId:
        return bedrock_agent_client.retrieve_and_generate(
            input={"text": input},
            retrieveAndGenerateConfiguration={
                "type": "KNOWLEDGE_BASE",
                "knowledgeBaseConfiguration": {
                    "knowledgeBaseId": kbId,
                    "modelArn": model_arn,
                },
            },
            sessionId=sessionId,
        )

    else:
        return bedrock_agent_client.retrieve_and_generate(
            input={"text": input},
            retrieveAndGenerateConfiguration={
                "type": "KNOWLEDGE_BASE",
                "knowledgeBaseConfiguration": {
                    "knowledgeBaseId": kbId,
                    "modelArn": model_arn,
                },
            },
        )

response = retrieveAndGenerate(
    "What are the potential risks and benefits of participating?", kb_id
)

generated_text = response["output"]["text"]
>>> "The potential risks include side effects from the study medication lithium such as nausea, loose stools, thirst, urination changes, shakiness, headaches, sweating, fatigue, decreased concentration, and skin rash. There is also a risk of lithium interaction with other medications. For women, there is a risk of birth defects if lithium is taken during pregnancy. There are no guaranteed benefits, but possible benefits include new information that could help the participant from the interviews and tests conducted during the study."

引用された情報ソースは、次のコードから取得できます (簡潔にするために出力の一部は編集されています)。

response["citations"]

>>> [
    {
        "generatedResponsePart": {
            "textResponsePart": {
                "text": " The potential risks include side effects from the study...",
                "span": {"start": 0, "end": 361},
            }
        },
        "retrievedReferences": [
            {
                "content": {
                    "text": "590 ICF#2 Page 7 of 19 The primary risks and discomforts of participation…"
                },
                "location": {"type": "S3", "s3Location": {"uri": "s3://XXXX/XXXX.pdf"}},
            },
            {
                "content": {
                    "text": "N/A CSP 590 ICF#2 Page 10 of 19 Risks associated with suddenly stopping study medications..."
                },
                "location": {"type": "S3", "s3Location": {"uri": "s3://XXXX/XXXX.pdf"}},
            },
        ],
    },
    {
        "generatedResponsePart": {
            "textResponsePart": {
                "text": " There are no guaranteed benefits, but possible benefits include...",
                "span": {"start": 363, "end": 531},
            }
        },
        "retrievedReferences": [
            {
                "content": {
                    "text": "research, not usual clinical care. After these are done we ask..."
                },
                "location": {"type": "S3", "s3Location": {"uri": "s3://XXXX/XXXX.pdf"}},
            }
        ],
    },
]

のセッションIDを渡すことで、 RetrieveAndGenerate API を使用すると、会話のコンテキストを保存し、フォローアップの質問をすることができます。たとえば、コンテキストがなければ、前の回答の詳細を尋ねた場合、正しく回答できない可能性があります。

retrieveAndGenerate("elaborate more on the first side effect", kb_id, sessionId=None)["output"]["text"]
>>> "The search results do not provide additional details about the mild nausea side effect that would allow me to elaborate further on it."

ただし、セッション ID を渡すことで、RAG パイプラインは対応するコンテキストを識別し、関連する回答を返すことができます。

retrieveAndGenerate("elaborate more on the first side effect", kb_id, sessionId=response["sessionId"])["output"]["text"]
>>> "The search results provide details that nausea from taking lithium is usually mild and goes away after days or weeks for most people. Specifically, up to 75% of people may experience mild nausea when first starting lithium, but this goes away in 90-99% of people who continue taking it."

次の表は、対応するすべての質問に対して取得された回答を示しています。

質問 回答
研究の目的は何ですか?研究の目的と研究の手順を必ず理解してください。 この研究の目的は、うつ病や双極性障害の患者が繰り返す自殺や自発的暴力を防ぐのにリチウムが効果的かどうかをテストすることである。
リスクと潜在的な利点は何ですか?フォームでは、参加することで生じる可能性のあるすべての予見可能なリスク、副作用、または不快感について説明する必要があります。 考えられるリスクや不快感には、不快感を引き起こす面接の質問、吐き気、軟便、喉の渇き、排尿の変化、震え、頭痛、発汗、疲労、集中力の低下、皮膚の発疹、甲状腺の変化、座瘡の悪化などのリチウム薬による副作用が含まれます。 /乾癬、リチウム中毒、および投薬を突然中止した場合のリスク。潜在的な利点は、この検査が参加者を助ける新たな情報につながる可能性があること、そしてリチウムがうつ病や双極性障害患者の反復的な自殺につながる自発的な暴力を防ぐのに役立つ可能性があることである。
参加には何が関係しますか?どのような検査、投薬、ライフスタイルの変更、または手順、それにかかる時間、および研究がどのくらいの期間続くかについての詳細を入手します。 参加には、思考、行動、メンタルヘルス治療、投薬、アルコールと薬物使用、家庭および社会的サポート、研究研究の理解などを対象としたインタビューとアンケートに回答することが含まれます。これには約 20 時間かかり、対面または電話で複数のセッションに分けて行うことができます。完全な研究の資格がある場合、XNUMX 年間で約 XNUMX 回の研究訪問が行われます。これには、治験薬の服用、バイタルサインの検査、アンケートへの記入、副作用の検討、通常の医学的および精神的健康管理の継続が含まれます。
費用や支払いはありますか?研究に関連する費用を負担するのか、それとも参加に対して報酬を受け取るのかを尋ねてください。 はい、検索結果には費用と支払いについて記載されています。研究の一部である治療や処置については費用が請求されることはありません。ただし、研究に関係のないケアや投薬に対する通常の退役軍人自己負担金は引き続き支払う必要があります。参加料は支払われませんが、交通費、駐車場などの参加に関連する費用は研究によって払い戻されます。払い戻しの金額とプロセスが示されています。
私のプライバシーはどのように保護されますか?フォームには、治験前、治験中、治験後にあなたの個人の健康情報がどのように機密として保たれるかを説明する必要があります。 あなたのプライバシーは、インタビューを非公開で実施し、メモを施錠したファイルやオフィスに保管し、電子情報を暗号化およびパスワードで保護されたファイルに保存し、あなたを特定する情報の開示を防ぐために保健福祉省から秘密保持証明書を取得することによって保護されます。 。あなたを特定する情報は、あなたの治療を担当する医師や政府機関による監査や評価のために共有される場合がありますが、研究に関する講演や論文によってあなたが特定されることはありません。

Amazon Bedrock Retrieve API を使用したクエリ

RAG ワークフローをカスタマイズするには、Retrieve API を使用してクエリに基づいて関連するチャンクを取得し、それを Amazon Bedrock が提供する LLM に渡すことができます。 Retrieve API を使用するには、次のように定義します。

def retrieve(query: str, kbId: str, numberOfResults: int = 5):
    return bedrock_agent_client.retrieve(
        retrievalQuery={"text": query},
        knowledgeBaseId=kbId,
        retrievalConfiguration={
            "vectorSearchConfiguration": {"numberOfResults": numberOfResults}
        },
    )

対応するコンテキストを取得します (簡潔にするために出力の一部を編集しています)。

query = "What is the purpose of the medical research study?"
response = retrieve(query, kb_id, 3)
retrievalResults = response["retrievalResults"]
>>> [
    {
        "content": {"text": "You will not be charged for any procedures that..."},
        "location": {"type": "S3", "s3Location": {"uri": "s3://XXXXX/XXXX.pdf"}},
        "score": 0.6552521,
    },
    {
        "content": {"text": "and possible benefits of the study. You have been..."},
        "location": {"type": "S3", "s3Location": {"uri": "s3://XXXX/XXXX.pdf"}},
        "score": 0.6581577,
    },
    ...,
]

プロンプト テンプレートのコンテキストを抽出します。

def get_contexts(retrievalResults):
    contexts = []
    for retrievedResult in retrievalResults:
        contexts.append(retrievedResult["content"]["text"])
    return " ".join(contexts)

contexts = get_contexts(retrievalResults)

Python モジュールをインポートし、コンテキスト内の質問回答プロンプト テンプレートを設定して、最終的な回答を生成します。

from langchain.prompts import PromptTemplate

PROMPT_TEMPLATE = """
Human: You are an AI system working on medical trial research, and provides answers to questions 
by using fact based and statistical information when possible.
Use the following pieces of information to provide a concise answer to the question enclosed in <question> tags.
If you don't know the answer, just say that you don't know, don't try to make up an answer.

<context>
{context_str}
</context>

<question>
{query_str}
</question>

The response should be specific and use statistics or numbers when possible.

Assistant:"""

claude_prompt = PromptTemplate(
    template=PROMPT_TEMPLATE, input_variables=["context_str", "query_str"]
)

prompt = claude_prompt.format(context_str=contexts, query_str=query)
response = claude_llm(prompt)
>>> "Based on the context provided, the purpose of this medical research study is to evaluate the efficacy of lithium compared to a placebo in preventing suicide over a 1 year period. Specifically, participants will be randomly assigned to receive either lithium or a placebo pill for 1 year, with their doctors and the participants themselves not knowing which treatment they receive (double-blind). Blood lithium levels will be monitored and doses adjusted over the first 6-8 visits, then participants will be followed monthly for 1 year to assess outcomes."

Amazon Bedrock LangChain 統合を使用したクエリ

エンドツーエンドのカスタマイズされた Q&A アプリケーションを作成するために、Knowledge Bases for Amazon Bedrock は LangChain との統合を提供します。 LangChain 取得プログラムを設定するには、ナレッジ ベース ID を指定し、クエリから返される結果の数を指定します。

from langchain.retrievers.bedrock import AmazonKnowledgeBasesRetriever

retriever = AmazonKnowledgeBasesRetriever(
    knowledge_base_id=kb_id,
    retrieval_config={"vectorSearchConfiguration": {"numberOfResults": 4}},
)

次に、LangChain RetrievalQA を設定し、ナレッジ ベースから回答を生成します。

from langchain.chains import RetrievalQA

qa = RetrievalQA.from_chain_type(
    llm=claude_llm,
    chain_type="stuff",
    retriever=retriever,
    return_source_documents=True,
    chain_type_kwargs={"prompt": claude_prompt},
)

[qa(q)["result"] for q in questions]

これにより、前の表にリストされているものと同様の対応する回答が生成されます。

クリーンアップ

追加料金が発生しないように、次のリソースを必ず削除してください。

まとめ

Amazon Bedrock は、あらゆる規模の RAG アプリケーションを強化するために深く統合された広範なサービスを提供し、企業データの分析を簡単に開始できるようにします。 Knowledge Bases for Amazon Bedrock は、Amazon Bedrock 基盤モデルと統合して、スケーラブルなドキュメント埋め込みパイプラインとドキュメント検索サービスを構築し、社内および顧客向けの幅広いアプリケーションを強化します。私たちは今後の将来に興奮しており、皆様のフィードバックはこの製品の進歩を導く上で重要な役割を果たします。 Amazon Bedrock の機能とナレッジベースの詳細については、以下を参照してください。 Amazon Bedrock のナレッジベース.


著者について

マークロイ AWS のプリンシパル機械学習アーキテクトとして、顧客の AI/ML ソリューションの設計と構築を支援しています。 Mark の仕事は、コンピュータ ビジョン、ディープ ラーニング、企業全体での ML のスケーリングに主な関心を持っており、幅広い ML ユースケースをカバーしています。 彼は、保険、金融サービス、メディアとエンターテイメント、ヘルスケア、公益事業、製造など、多くの業界の企業を支援してきました。 Mark は、ML スペシャリティ認定を含む 25 つの AWS 認定を取得しています。 AWS に入社する前、Mark は 19 年以上にわたってアーキテクト、開発者、テクノロジーのリーダーとして活躍し、その中には金融サービスでの XNUMX 年間の勤務も含まれます。

マニカヌジャ テックリード – ジェネレーティブ AI スペシャリストであり、書籍「Applied Machine Learning and High Performance Computing on AWS」の著者であり、女性製造教育財団理事会のメンバーでもあります。 彼女は、コンピューター ビジョン、自然言語処理、生成 AI などのさまざまなドメインで機械学習 (ML) プロジェクトを主導しています。 彼女は、顧客が大規模な機械学習モデルを構築、トレーニング、デプロイできるよう支援します。 彼女は、re:Invent、Women in Manufacturing West、YouTube ウェビナー、GHC 23 などの社内外のカンファレンスで講演しています。自由時間には、ビーチに沿って長距離を走るのが好きです。

BaichuanSun博士は現在、AWS でシニア AI/ML ソリューション アーキテクトを務めており、生成 AI に重点を置き、データ サイエンスと機械学習の知識を応用して、実用的なクラウドベースのビジネス ソリューションを提供しています。経営コンサルティングと AI ソリューション アーキテクチャの経験を活かし、ロボティクス コンピュータ ビジョン、時系列予測、予知保全など、さまざまな複雑な課題に取り組んでいます。彼の仕事は、プロジェクト管理、ソフトウェア研究開発、学術的研究の確かな背景に基づいています。サン博士は仕事以外では、旅行と家族や友人との時間を過ごすことのバランスを楽しんでいます。

デリック・チュー AWS のシニア ソリューション アーキテクトは、顧客のクラウドへの移行を加速し、クラウドベースのソリューションの導入を通じてビジネスを変革することに重点を置いています。彼の専門知識はフルスタック アプリケーションと機械学習の開発です。フロントエンド ユーザー インターフェイス、IoT アプリケーション、API とデータの統合、機械学習モデルをカバーするエンドツーエンドのソリューションの設計と構築を顧客が支援します。自由時間には、家族と時間を過ごしたり、写真やビデオ撮影を楽しんでいます。

フランク・ウィンクラー シンガポールを拠点とする AWS のシニア ソリューション アーキテクト兼ジェネレーティブ AI スペシャリストであり、機械学習とジェネレーティブ AI に重点を置いています。彼は世界的なデジタルネイティブ企業と協力して、AWS 上でスケーラブルで安全かつコスト効率の高い製品とサービスを設計しています。自由時間には息子や娘と時間を過ごし、ASEAN 全域で波を楽しむために旅行しています。

ニヒル・チャダーワラ グローバル ヘルスケアおよびライフ サイエンス チームのシニア AI/ML ソリューション アーキテクトです。彼の専門知識は、特に生物医学、ライフサイエンス、ヘルスケアの分野における顧客の問題に対するビッグデータと AI を活用したソリューションの構築です。彼はまた、量子情報科学と AI の交差点にも興奮しており、この分野で学び、貢献することを楽しんでいます。余暇には、テニス、旅行、宇宙論の学習を楽しんでいます。

スポット画像

最新のインテリジェンス

スポット画像