人工知能(AI)の人気が高まる中、日常業務を効率化するためにシンプルなチャットボットアプリケーションの作成を検討する人が増えています。しかし、これらのアプリケーションが急速に成長し、効率的に拡張する必要がある場合はどうなるでしょうか?このような場合に、アプリケーションのパフォーマンスを確認し、最適な機能を維持し、ダウンタイムを最小限に抑えるのに役立つ、オブザーバビリティツールが非常に貴重であることがわかります。このブログ記事では、シンプルな生成AIアプリケーションを作成し、AIにより引き起こされる可能性のある潜在的な問題について学び、New Relicを使用してこれらの問題を発生前および発生時に軽減する方法を確認します。

AIテクノロジーについて

メディアや現在の誇大宣伝に与えられた概念を超えて、実際のAIとは何でしょうか?AIとは人間のように考え、学習するようにプログラムされた機械における人間の知能のシミュレーションです。

AIの中核的な特性には、オブジェクト、音声、テキストの認識を含む、学習、推論、問題解決、および世界の認識能力が含まれます。Alexaにノックノックジョークを言ってもらったことがあるなら、すでにAIを使用したことになります。現在人気のあるAIツールには、Siri、Googleアシスタント、Cortanaなどがあります。これらのバーチャルアシスタントは、特定のタスクを実行するように設計されているものの、それらのタスクを超えて理解したり推論したりすることはできないため、狭いAI(弱いAIとも呼ばれる)の例になります。

ChatGPTにメールの改良を依頼したことがある場合は、いわゆる生成AIを使用したことになります。これは、トレーニングに基づいて定義された制約内でコンテンツを作成することに焦点を当てた、限定AIのサブセットです。このブログ記事では、この種のAIについて説明します。

生成AIアプリケーションの作成

最初に行うことは、バーチャルヘルスコーチとして機能する生成AIアプリケーションを作成することです。OpenAI GPTモデルとLangChainフレームワークを使用して、ヘルス関連の質問を入力として受け取り、ユーザーが健康的な習慣を身につけるのに役立つガイダンスとサポートを提供できる健康アプリを開発します。

開発プロセス

このAIアシスタントは内部で次のことを行います。

  • ヘルスコーチの「頭脳」(または提供される一次情報源)として機能するYouTubeビデオを使用します。
  • ビデオからトランスクリプトを処理します。
  • トランスクリプトの詳細をFAISSライブラリに保存して、検索可能なデータベースを作成します。

この図は、バーチャルヘルスコーチチャットボットの技術的なアーキテクチャーフローに関するインサイトを説明しています。

上記のプロセスは、次に示すようにcreate_vector_db_from_youtube_url(video_url:str)関数でキャプチャされます。

def create_vector_db_from_youtube_url(video_url:str) -> FAISS:
    loader = YoutubeLoader.from_youtube_url(video_url)
transcript = loader.load()

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
    docs = text_splitter.split_documents(transcript)

db = FAISS.from_documents(docs,embeddings)
    return db

AIアシスタントの「頭脳」を作成する次の手順は以下のとおりです。

def get_response_from_query(db, query, k=4):
  • ユーザーの質問に基づいて、FAISSデータベースで類似性検索を実行します
   docs = db.similarity_search(query,k=k) 
   docs_page_content = " ".join([d.page_contentfor d in docs])
  • OpenAI gpt-3.5-turboLLMバージョンを初期化します
 llm = OpenAI(model="gpt-3.5-turbo") 
  • モデルにヘルスコーチとして機能するように指示するプロンプトテンプレートを設定し、一次情報源として指定したビデオトランスクリプトに基づいて質問に回答します
prompt = PromptTemplate(
        input_variables=["question", "docs"],
        template="""
        ビデオのトランスクリプトに基づいて、植物ベースのライフスタイルに関する質問に答えることができる、役立つバーチャルヘルスコーチです。
        
        次の問題に回答してください: {question}
        次のビデオトランスクリプトを検索して: {docs}

        質問に答えるには、トランスクリプトからの事実情報のみを使用してください。
        
  質問に答えるのに十分な情報がないと思われる場合は、「わからない」と言ってください。
        
        回答は詳しく説明してください。
""",
    )
  • 指定されたLLMとプロンプトテンプレートに基づいて、言語モデルの操作チェーンを作成します
    chain = LLMChain(llm=llm, prompt=prompt)
  • フォーマットされた応答と、応答の生成に使用されたドキュメントを返します
    response = chain.run(question=query,docs=docs_page_content)
    response = response.replace("\n","") #formatting
    return response, docs 

上で説明したプロセスは、RAGが次の関数によってどのように機能するかを示す例です。

  1. ユーザーの入力(またはプロンプト)を受け取り、ベクトルデータソースから関連するドキュメントを取得します
  2. プロンプトと取得したデータを処理して、ドキュメントから通知された応答を生成します
  3. フォーマットされた応答をユーザーに返します

このプロセスの最終コードは、次に示すようにget_response_from_query(...)関数で示されます。

def get_response_from_query(db, query, k=4): 
    docs = db.similarity_search(query,Plantk=k) 
    docs_page_content = " ".join([d.page_contentfor d in docs])

    #Work with the LLM - 
    llm = OpenAI(model="gpt-3.5-turbo") 

#Work with the Prompt
    prompt = PromptTemplate(
        input_variables=["question", "docs"],
        template="""
        ビデオのトランスクリプトに基づいて、植物ベースのライフスタイルに関する質問に答えることができる、
        役立つバーチャルヘルスコーチです。
        
   次の問題に回答してください: {question}
        次のビデオトランスクリプトを検索して: {docs}

        質問に答えるには、トランスクリプトからの事実情報のみを使用してください。
        
        質問に答えるのに十分な情報がないと思われる場合は、「わからない」と言ってください。
        
        回答は詳しく説明してください。
""",
    )

    #Work with the Chain component 
    chain = LLMChain(llm=llm, prompt=prompt)

    response = chain.run(question=query,docs=docs_page_content)
    response = response.replace("\n","") #formatting
    return response, docs 

ユーザーインタフェースとユーザー体験

AIの主要なプログラミングが確立されたので、Streamlitライブラリを使用して、ユーザーがバーチャルヘルスコーチと連携するためのインタラクティブなウェブアプリケーションを起動します。このAIアプリのユーザーインタフェースコンポーネントを処理するコードスニペットは、次の場所にあります。

import streamlit as st
import packaging.version
import virtual_health_coach as eHealthCoach 
import textwrap 


st.title(" :violet[Virtual Health Coach]")

with st.sidebar:
    with st.form(key="my_form"):
        query = st.sidebar.text_area(
            label="健康に関する質問は何ですか?",
            max_chars=50,
            key="query"
        )
   submit_button = st.form_submit_button(label='Submit') 

if query: 
     db = eHealthCoach.create_vector_db_from_youtube_url("https://www.youtube.com/watch?v=a3PjNwXd09M")
     response, docs = eHealthCoach.get_response_from_query(db,query)
     st.subheader("Answer:")
     st.text(textwrap.fill(response,width = 85))

このコードをすべて有効にする、またはこのアプリケーションを起動するインポートされたライブラリの詳細については、ReadMeファイルを参照してください。

AIデモアプリ:バーチャルヘルスコーチ

ここまでで、健康関連の質問に答えるように、バーチャルヘルスコーチとして設計された生成AIテクノロジーを開発しました。たとえば、チャットボットに植物ベースの食事に関する情報を提供するよう依頼すると、コード内で指定されているYouTubeソースに基づいて応答します。

「どうすれば自転車に乗れますか?」というような質問をすると、チャットボットはいくつかの異なる方法で応答します。

1

つまり、その理解に基づいた精緻な応答、またはコードで指定されているもの以外のソースを提供します

2

指定されたYouTubeソースではその質問に直接インサイトを提供していないため、あまり詳細ではない回答が得られます

3

ある程度の真実を含んでいるような応答が提供されます。しかし、よく見てみると、まったく無意味であることがわかります

最後のスクリーンショットに見られるような無意味な応答は、一般にAIの幻覚症状と呼ばれます。この幻覚症状は、状況によっては無害で滑稽にさえ見える場合もありますが、規模が大きくなると問題になる可能性があります。誤った情報により、ユーザーは誤った決定を下す可能性があり、ひいては法的問題につながるおそれがあります。

もう1つの注意すべき点は、コード内で指定されているYouTubeトランスクリプトをチャットボットが参照しているように見えますが、3つの異なる方法で応答したことです。これは、このテクノロジーの非決定的な性質を示しています。企業の応答が時々しか正確でない場合、または非論理的な記述が含まれている場合、その企業は信頼できないとみなされる可能性があります。バックエンドでは、誤った出力により、トークンや埋め込みなどの追加のテレメトリーデータ収集を含むリソースの過剰消費が発生し、全体の運用コストが増加する可能性があります。

New RelicはAIアプリケーション内の幻覚症状を直接検出することはできませんが、それを技術スタックに組み込むことで問題を軽減し、ユーザー体験に関するインサイトを得ることができます。アプリケーションのパフォーマンスを監視できるだけでなく、提供された入力に関してユーザーがAIコンポーネントとどのように対話しているか、それに応じて生成される出力の種類も確認できます。このメタデータにインサイトを取り込むことで、開発者はコードに埋め込まれたエンジニアリングプロンプトテンプレートやその他の変数を最適化し、AIによって生成される今後のエラーを防ぐことができます。

この図は、オブザーバビリティツールとしてNew Relicを使用した、バーチャルヘルスコーチチャットボットの技術的なアーキテクチャーフローに関するインサイトを説明しています。

New Relic AI Monitoring機能

前述したように、生成AIテクノロジーは、LLM、オーケストレーションフレームワーク、データソース、インフラストラクチャ、アプリケーション自体から構成されるいくつかの高度なレイヤーで構成されています。これらのレイヤーは、アプリケーションとのユーザーインタラクションを容易にしますが、スループット(ユーザートラフィック)やその他のテレメトリーデータによって測定される、コスト、パフォーマンス、ユーザーエンゲージメントに影響を与える複雑さが生じます。これらのバロメーターを理解することがビジネスにとって重要であるがゆえ、AIモニタリングが導入されました。New Relicのような監視ツールを使用すると、ユーザーはこれらすべてのテレメトリーデータポイントへの包括的なインサイトを迅速に取得できるだけでなく、そのAPM 360機能は、サポートされているAPMエージェントを通じてAIアプリケーションに固有の機能を直接自動的に検出します。バーチャルヘルスコーチはPythonで記述されているため、New Relic Pythonエージェントを使用してアプリケーションを計装すると、アプリケーションを動作可能にするさまざまなバックエンドプロセスを監視できます。

New RelicのAIモニタリング機能をテストするには:

1

one.newrelic.comで、New Relicプラットフォームにサインインします

2

Add Dataを選択します

3

「Python」と入力し、Application monitoringビューでオプションを選択します

4

Pythonガイドのインストレーションマニュアルに従って、New Relicでアプリケーションを計装し、バーチャルコーチをリリースします

5

ログとインフラストラクチャを接続します

6

接続をテストします

これで、プラットフォームの[すべてのエンティティ]ビューにアプリケーションが一覧表示されるようになります。

アプリケーションをクリックすると、インサイト全体でアプリケーションが受信しているリクエストの数が表示されるだけでなく、AI Responsesという新しいセクションも表示されます。

AI responsesビュー内では、以下に関するインサイトが得られます。

  • チャットボットが一定時間内に受信するリクエストの数
  • チャットボットがユーザーに応答するまでにかかる平均応答時間
  • 応答ごとの平均トークン使用量
  • 最大のスループットが得られた場所のタイムライン

また、チャットボットが提供した応答とともに正確なユーザーリクエストを表示することで、ユーザーからチャットボットへのインタラクションをさらに詳細に分析する、新しい応答テーブルもあります。これらの詳細により、コード内のプロンプトテンプレートを最適化する方法、またはベクトルデータベースに保存、フェッチ、取得する追加データを提供するプロンプトの最適化方法についての開発者の認識が向上します。さらにカスタマイズされたリソースを追加すると、理論的にはAIの知識ベースを微調整でき、チャットボットがより有意義な方法でユーザーに応答できるようになります。

ユーザーのリクエストをさらに深く理解するには、特定のリクエスト列をクリックして、チャットボットがユーザーのリクエストを処理してから応答するまで内部で何が起こっているかを確認します。ユーザーリクエストに使用されている正確なGPTモデル(またはLLM)と応答で使用されているGPTモデルが見つかります。また、ユーザーとチャットボットの各インタラクションに必要なトークンの合計量や、チャット完了中に最大トークンの上限にどの程度近づいているかを確認することもできます。

これらの詳細は、AI開発者がアプリケーションのパフォーマンスを評価してさらに最適化し、コストを可能な限り低く抑えると同時に、全体的なユーザー体験を理解してアプリケーションをよりシームレスにするための鍵となります。

まとめ

このブログを通じて、以下を学びました。

  • シンプルなチャットボットアプリケーションを構築する
  • その作成の結果として生じる可能性のある倫理的懸念を理解する
  • New Relic AI Monitoring機能を通じて、アプリ内のユーザーエンゲージメントやその他の重要なメトリクスを測定する

ユーザーリクエストの詳細、返された応答、チャット完了までにかかった平均応答時間、プロセス全体で使用されるトークン、使用されるLLMなど、New RelicのAI機能が、チャットボットなどのAIアプリに関する包括的なインサイトをAI開発者にどのように提供できるかを理解しました。New RelicのAIモニタリングを使用すると、AIアプリケーションがもたらす複雑さのほとんどを安全に回避できるため、ビジネスの優先順位(コストなど)をそれに応じて管理しながら、シームレスなユーザー体験の開発に集中できます。