Amazon Web Services ブログ

Amazon Bedrockの生成 AI を活用してパーソナライズされた学生コンパニオンを構築

本記事は 2024年4月3日に公開された ”Build a personalized student companion powered by generative AI on Amazon Bedrock” を翻訳したものです。

学生の学習ニーズは多様で、教育者が利用できるリソースは限られているため、個別学習は現代の教育における差し迫った課題です。一対一での相談や仲間との学習グループといった従来の学習サポート方法では、カスタマイズされたガイダンスを提供したり、知識のギャップを埋めるには不十分であることがよくあります。さらに学習者それぞれが異なる長所、短所、学習スタイルを持つという本質的な多様性が、この課題をより複雑にしており、画一的なアプローチはますます時代遅れになっています。

この急速に進化する環境において、生成 AI大規模言語モデル(LLM)の出現は、これらの長年にわたる教育上の課題に取り組むための変革の機会をもたらしています。膨大なデータセットに基づいてトレーニングを受けた LLM は、自然言語を理解し、意味を解釈し、文脈的に関連性のある人間らしい応答を生成できます。Retrieval-Augmented Generation(RAG)は、応答を生成する前にトレーニングデータ以外の信頼できる知識ベースを参照することで、LLMの出力をさらに向上させます。

この記事では、パーソナライズされた学習サポートの課題に対応する、自分のペースで進められる学生コンパニオンの導入方法を説明します。学生のプロフィールと教育機関の学習コンテンツコーパスを組み合わせることで、生成 AI モデルを使用して学生体験をパーソナライズし、各学生固有の長所と短所に合わせた教育支援を提供します。コンテンツ生成のための LLM を呼び出すための Amazon Bedrock、教育コンテンツを統合するための Knowledge Bases for Amazon Bedrock、更新されていく学生の成績データストアとして Amazon Aurora Serverless など、AWS サーバーレステクノロジーを利用しています。このアプローチは、AIの力を利用して、学習者の多様なニーズとスキルセットに応える、パーソナライズされた適応性のある学習コンパニオンを作成します。

前提条件

この記事で説明したアプローチを実装するには、次のものが必要です。

  • コース教材やその他の教育リソースなど、教育機関の学習コンテンツコーパスを含む既存の Amazon Simple Storage Service (Amazon S3) バケット。
  • 登録されたモジュールや成績などの学生登録データを保存するための、ユーザーアカウントにある Amazon Aurora データベースインスタンス。
  • 学生の ID を管理し、アプリケーションへのアクセスを許可するように設定された ID プロバイダーサービス。たとえば、Amazon Cognitoを使用してユーザーの認証と認可を処理することはできますが、サービスの設定はこの記事では対象外です。

ソリューション概要

パーソナライズされた学習コンパニオンは、各学生の独自のプロフィールとスキルセットに適応する必要があります。次のシナリオを考えてみましょう。科学に熱心なエマと、特定の概念に苦労しているマイケルが同じコースに登録されています。エマは理解を深めるために高度な洞察と難しい質問が役立つでしょうが、マイケルは教材を補強するために簡単な説明と追加の例が必要です。パーソナライズされた学習コンパニオンは、それに応じてアプローチを調整し、両方の学生がそれぞれの強みと改善すべき分野に合わせてカスタマイズされたサポートを受けられるようにします。

このワークフローを実証するために、この記事では次の図に示すアーキテクチャの概要を説明します。

図1.パーソナライズされた学習コンパニオンのハイレベルアーキテクチャ。主なコンポーネントは、学習コンパニオンチャットボット、Amazon Bedrock、Amazon Aurora Serverless、Amazon OpenSearch Serverless、Amazon S3 バケットです。

ソリューションの手順

パーソナライズされた学生コンパニオンを構築するワークフローは、次の手順に従います。

  1. アプリケーションは、教育機関のデータベースから、成績や登録モジュールを含む学生の記録を取得します。
  2. アプリケーションは学生データをプロンプトと組み合わせ、LLMを呼び出してパーソナライズされた学生プロフィールを作成します。
  3. プロンプト拡張プロセスでは、学生のプロフィールと入力質問を統合し、学生固有の強みや改善すべき分野に応じてモデルの出力を調整します。
  4. アプリケーションは、教育機関の学習コンテンツコーパスを検索して、学生の入力問題に関連する資料を探します。
  5. LLMは、関連する学習教材とカスタマイズされた学生プロフィールの両方を組み込んだ個別の回答を生成するために呼び出されます。
  6. 学生の個々のプロフィールとニーズに合わせてカスタマイズされた回答が学生に配信されます。

ステップ1 — 学生記録の取得

パーソナライズされた学生プロフィールを生成するには、学生の学業成績、成績、履修モジュールからの構造化データを分析する必要があります。このデータには通常、学生が教育機関での学習期間中に継続的に更新される取引情報が含まれます。LLM を呼び出してプロフィール生成を行う際にこのデータを効果的に利用するには、RAG を使用します。RAG により、LLM は学生記録データベースから関連情報を取得して組み込むことができるため、生成されたプロフィールが学生の現在の学業状況と学習要件を正確に反映できるようになります。
以下の簡単なデータベーススキームは、Amazon Aurora PostgreSQL 互換エディションをデータベースとして使用する場合のユースケースを示しています。

CREATE TABLE student ( /* Students table, including student Id and name */
  id SERIAL PRIMARY KEY,
  name TEXT  
);

CREATE TABLE module ( /* Modules table, including module ID and label */
  id SERIAL PRIMARY KEY, 
  label TEXT
);

CREATE TABLE enrollment ( /* Students’ enrolled modules and grades */
  id SERIAL PRIMARY KEY,
  student_id INTEGER REFERENCES student(id),
  module_id INTEGER REFERENCES module(id), 
  grade INTEGER
);
SQL

次のコードスニペットは、データベースから学生の成績を取得するのに役立ちます。

import psycopg2

def get_student_modules_and_grades(connection_string, student_id):
  modules_and_grades = []
  conn = psycopg2.connect(connection_string)
  cursor = conn.cursor()

  query = """
  SELECT module.label, enrollment.grade
  FROM module
  JOIN enrollment ON module.id = enrollment.module_id
  WHERE enrollment.student_id = %s
  """

  cursor.execute(query, (student_id,))
  for row in cursor:
    module = {
      "label": row[0],
      "grade": row[1]
    }
    modules_and_grades.append(module)
  conn.close()
  return modules_and_grades
Python

ステップ 2 — パーソナライズされた学生プロフィールを作成する

前のステップの出力に基づいて、アプリケーションはLLMを呼び出して学生プロフィールを生成します。次のコードスニペットは、Amazon Bedrock で利用可能になった新しい Claude 3 Sonnet モデルを使用したこのステップを示しています。

import boto3 
import json 
PROFILE_PROMPT = """ 
You are a student companion chatbot tasked with generating a unique profile for a student based on their enrolled modules and grades. The profile should have three parts: 

Domain of Speciality: Based on the modules the student is enrolled in, identify their likely domain or field of speciality. 

Main Strengths: Based on the grades obtained, determine the student's main strengths or areas of academic excellence. 

Areas of Improvement: Based on the relatively lower grades, suggest areas where the student could potentially improve. 

Here are the modules the student is enrolled in and the grades they have obtained: {modules_and_grades} 

Generate a student profile with the three parts mentioned above, keeping in mind the input modules and grades. 

Assistant: 
"""

def create_user_profile(connection_string, student_id): 
    PROFILE_PROMPT = PROFILE_PROMPT.format( 
        modules_and_grades = get_student_modules_and_grades(
            connection_string, student_id)) 
        bedrock = boto3.client(service_name='bedrock-runtime') 
        messages = [ { "role": "user", "content": 
            [ { "type": "text", "text": PROFILE_PROMPT} ] } ] 
        body = json.dumps({ "anthropic_version": "bedrock-2023-05-31", "max_tokens": 1000, "messages": messages }) 
        response = bedrock.invoke_model(
            modelId="anthropic.claude-3-sonnet-20240229-v1:0", 
            contentType='application/json', 
            accept='application/json', 
            body=body ) 
        response_body = json.loads(response.get('body').read() 
        return response_body
Python

このコードは、学生が登録したモジュールと成績に基づいて、学生の専門分野、長所、改善点という3つの部分に分かれてパーソナライズされた学生プロフィールを返します。

ステップ3 — 学生プロフィールを使用して学習教材をカスタマイズする

学生固有のプロフィールが生成されたら、プロンプトエンジニアリングを使用して学生の入力クエリをプロフィールデータで拡張することができます。これにより学生の学業上のニーズや強みに合わせたパーソナライズされた学習コンテンツを生成できます。これにより、LLM は学生のプロフィールを理解し、それに応じて回答を調整することができます。以下はプロンプトのテンプレートです。

AUGMENTED_PROMPT = """ 
You are a personalized student companion chatbot. Your task is to provide a detailed answer to the following question while tailoring the response based on the given student profile: 

Student Profile: {student_profile} 
Learning material: {learning_corpus} 
Question: {input_question} 

When generating the answer, keep the following in mind: 
- Adjust the level of complexity and depth based on the student's strengths and areas of improvement identified in the profile. 
- Provide examples and explanations that align with the student's domain of specialty. 
- Offer suggestions or additional resources to help the student improve in areas where they may be struggling. 

Your personalized answer: """
Python

ステップ 4 — 教育機関の学習コーパスからコンテンツを取得する

学生の意見に関連するコンテンツを取得するには、Amazon Bedrock でナレッジベースを作成し、教育機関の学習コンテンツコーパスをアップロードする必要があります。Knowledge Bases for Amazon Bedrock を作成する手順については、「ナレッジベースを作成する」を参照してください。その後、Bedrock retrieve API を使用してナレッジベースをクエリし、学生が入力した質問に関連する関連資料を取得できます。このステップを実装するコードスニペットは、LLMを呼び出すコードとともにステップ5に示されています。

ステップ 5 — LLM を呼び出してパーソナライズされたコンテンツを生成する

学生プロフィール、質問内容、およびナレッジベースから取得した関連資料が揃ったら、LLMを使用して、学生固有のニーズと強みに合わせた個別の回答を生成できます。まず、手順 3 の拡張プロンプトテンプレートを使用して、学生プロフィール、取得した学習教材、学生が入力した質問を 1 つのプロンプトに集約して、拡張プロンプトを作成します。次に、拡張されたプロンプトを使用して Amazon Bedrock API を通じて LLM を呼び出し、パーソナライズされたレスポンスを生成します。
次のコードスニペットは、このプロセスを示しています。

def question_answering_and_generation(kb_id, profile, question, prompt):
    # Retrieving contextual learning material from Bedrock Knowledge Base
    kb_client=boto3.client(service_name='bedrock-agent-runtime')
    response = knowledge_client.retrieve(
    knowledgeBaseId=kb_id,retrievalQuery={ 'text': question })
    answer = response['retrievalResults'][0]['content']

    # Augmenting the prompt for LLM invocation
    full_prompt = prompt.format(
    student_profile=profile, learning_corpus= answer, input_question=question)
    runtime_client = boto3.client('bedrock-runtime')
    messages = [ {
        "role": "user", "content": [ {
            "type": "text", "text": full_prompt
            } ]
        } ]
    body = json.dumps({ "anthropic_version": "bedrock-2023-05-31", "max_tokens": 300, "messages": messages })

    # Invoke Claude with the agumented prompt
    response = runtime_client.invoke_model(
            modelId="anthropic.claude-3-sonnet-20240229-v1:0",
            contentType='application/json',
            body=body
            #body=json.dumps({ "prompt": full_prompt })
        )

    # Return the generated response
    return json.loads(response.get('body').read())
Python

最後に、ステップ6でパーソナライズされた回答を学生に返します。

ソリューションを説明するために、この記事で前述したエマとマイケルの例を使用します。エマとマイケルの両方が数学のモジュールに在籍していて、ピタゴラスの定理について学んだ幾何学の授業に出席したばかりだとしましょう。エマの成績によると、彼女は自然科学と数学に堪能ですが、美術と外国語はまだ上達できます。反対に、マイケルは美術と文学には優れていますが、数学と応用科学には多少の困難があります。2人とも授業で見たピタゴラスの定理をよりよく理解するために、学生用コンパニオンチャットボットを使用します。
次のスクリーンショットでは、エマの見解とマイケルの学習中の学生コンパニオンに対する見解を示しています。
最初のスクリーンショットは、パーソナライズされた学生コンパニオンとのエマの体験を示しています。

図 2.ピタゴラスの定理に関するエマの質問に対する個別の回答。

スクリーンショットの最初の部分は、学習コンパニオンアプリケーションが、ステップ 2 でデータベースから抽出された現在の成績に基づいてエマの学生プロフィールをどのように更新したかを示しています。2つ目の部分では、このパーソナライズされたプロフィールと、教育機関の学習コーパスのコンテンツを使用して、数学と科学の豊富なバックグラウンドに基づいて回答をパーソナライズしました。
次のスクリーンショットは、パーソナライズされた学生コンパニオンとのマイケルの体験を示しています。マイケルの個人的な対応は、彼の美術の強みを活かした視覚的なアプローチをとることで、数学を改善したいという彼のニーズに応えています。

図 3.ピタゴラスの定理に関するマイケルの質問に対する個別の回答。

この例は、同じ入力クエリの結果が、各学生の固有の長所、短所、専門分野に合わせてカスタマイズされた個別の応答を生成する方法を示しています

結論

この記事では、生成 AI を使用して、学生固有のプロフィールとニーズに合わせてパーソナライズされた学習コンテンツを提供するソリューションについて説明しました。Amazon Bedrock を使用して大規模言語モデルを呼び出し、Amazon Aurora Serverless や Amazon Bedrock ナレッジベースなどの AWS サーバーレスサービスと統合することで、各学生の長所、短所、専門分野に基づいてカスタマイズされた説明を生成する適応型システムを構築しました。これにより、教育機関は自分のペースで AI 駆動型学習支援を大規模に提供できるようになり、多様な学習要件や限られた教育者リソースの課題に取り組むことができます。数学の授業の簡単な例で説明しましたが、ここで概説した原則は、分野や学習環境を超えて適用できます。全体として、この記事では、AWS の包括的な AI およびサーバーレスサービスを活用して、Amazon Bedrock で利用できる生成 AI の強力な機能を通じて、どのように個別教育を変革できるかを紹介しました。

さらに詳しく:

Nizar Kheir

Nizar Kheir

Nizar は Amazon Web Services (AWS) のシニアソリューションアーキテクトで、様々な業界にわたって15年以上活躍してきました。現在はフランスおよび EMEA に及ぶパブリックセクターの顧客と連携し、IT インフラストラクチャのモダナイズや AWS Cloud を活用したイノベーションの促進を支援しています。

本ブログはソリューションアーキテクトの田村健祐が翻訳しました。原文はこちらです。