🐈

AIについて調査してみました-①

2024/07/19に公開

タイトルの通りですが、AIを触ったことがないので、調査の中で色んな記事を読んで頭混乱してきました... 頭の中のものを整理するために記事にしてみましたが、せっかく書いたので、共有しようと思います。主にはRAGの原理やデータ分析への応用について調べたものの整理になりますが、内容が間違っている可能性も全然あり得ますので、本当にご参考程度で読んでいただければと思います。また、コメントもいただけるとありがたいです。

目次

RAGについて

訓練データに含まれていない外部データに基づいてAIが回答してくれる仕組みである。

特徴

  • モデルの再訓練が不要
  • プライベートな資料に基づいて回答することが可能

基本原理

  1. ドキュメントのテキスト文章を抽出
  2. テキスト文章を複数段落に分ける(チャンクする)
  3. チャンクした段落をベクトル化する(LLMのembeddingモジュールを使用)
  4. 質問文をベクトル化する(LLMのembeddingモジュールを使用)
  5. 質問文のベクトルとチャンクした段落のベクトルを比較し、関連性の高いN個の結果を抽出
  6. 質問文と抽出した段落でプロンプトを作成し、AIに対して質問を投げる。

■プロンプトの例:

以下の質問に以下の情報をベースにして答えて下さい。
  [ユーザーの質問]
  {質問文}

  [情報]
  {抽出した段落}

■参考リンク

https://zenn.dev/yumefuku/articles/llm-langchain-rag
https://ncdc.co.jp/columns/8742/#AI-4

また、文書を毎回ベクトル化すると効率悪いため、実務上は予めベクトル化して「インデクス」に登録して、必要の時ベクトルで検索して抽出する方法が一般的らしい。そのインデックスを管理するDBとしては、ElasticSearchOpenSearchKendraAzure AI Searchなどがよく利用される。

サンプルコード

以下を参照。
本サンプルはLangChainを使わず、GPT-4oを直接使用してZenn Publicationの料金Webページの内容に基づいて回答してくれる簡単のRAGサンプルである。

本サンプルはGoogle Colabなどの環境で実行する。ただし、OpenAIのAPI KeyとAPIを実行するクォーターを購入するが必要です。

  • まずはOpenAIをインストール
!pip install openai==1.35.15
  • 次のコードを実行する。
import numpy as np
import os
import requests
from openai import OpenAI
from sklearn.metrics.pairwise import cosine_similarity
from google.colab import userdata
from bs4 import BeautifulSoup


#OpenAIクライアント作成
client = OpenAI(
    api_key=userdata.get("openai-key")
)

#URLテキスト抽出
def text_extraction(url):
  response = requests.get(url)
  soup = BeautifulSoup(response.text, "html.parser")
  all_text = "".join(t.text.replace("\t", "").replace("\n", "") for t in soup.find_all("p"))

  return all_text

#URL内容をチャンク
chunk_size = 500
overlap = 50
def chunk_text(text):
  chunks = []
  start = 0
  while start + chunk_size < len(text):
    chunks.append(text[start:start + chunk_size])
    start += chunk_size - overlap

  chunks.append(text[start:])

  return chunks

#関連度高いチャンクを抽出
def find_most_similar(question_vector, doc_vectors, documents, top_n):
  similarities = cosine_similarity([question_vector], doc_vectors)[0]
  similarities = list(enumerate(similarities))
  similarities.sort(reverse=True, key=lambda x: x[0])
  top_documents = [documents[index] for index, similarity in similarities[:top_n]]

  return top_documents

#テクストをベクトル化
def vectorize_text(text):
  response = client.embeddings.create(
      input = text,
      model = "text-embedding-3-small"
  )
  return response.data[0].embedding

#質問する。
def ask_question(question, context):
  prompt = f'''以下の情報をベースに質問に答えて下さい。
  [質問内容]
  {question}

  [情報]
  {context}
  '''
  print(prompt)
  response = client.chat.completions.create(
      model="gpt-4o",
      messages=[{"role": "user", "content": prompt}],
      max_tokens=200
  )

  return response.choices[0].message.content

if __name__ == "__main__":
  url = "https://zenn.dev/publications"

  url_text = text_extraction(url)
  text_chunks = chunk_text(url_text)
  vectors = [vectorize_text(doc) for doc in text_chunks]

  question = "Publication Proプランの価格はいくらですか?"
  question_vector = vectorize_text(question)

  #関連度元も高いnこのチャンクで参考資料としてOpenAIに渡す。
  similar_document = find_most_similar(question_vector, vectors, text_chunks, 5)

  answer = ask_question(question, similar_document)
  print(answer)

OpenAIに投げるプロンプトと回答は以下になる

以下の情報をベースに質問に答えて下さい。
  [質問内容]
  Publication Proプランの価格はいくらですか?

  [情報]
  ['プトをもっと読む無料でお使いいただけます。詳しくはPublicationの使い方をご覧ください。エンジニアのための情報共有コミュニティ', '術広報の取り組みとして、2024年2月に技術者のための情報共有コミュニティ「Zenn」の企業・組織向け機能「Publication」を用いて自社テックブログ「レバテック開発部」を開設しました。チームのメディア運営に必要な基本機能を提供します。無料対象ブランディングのための高度な機能を利用いただけます。9,980円 / 月 または 99,800円 / 年(初回30日間無料)Publication Free に加えて私たちは、記事は著者本人の持ち物であり、退職後も本人が管理できるべきだと考えています。 Publicationを脱退した著者は、Publicationに投稿した記事をそのまま残しておくことも、個人の記事に変更することもできます。どちらを選択しても、記事は著者の成果物としてプロフィールに残ります。「それでは会社の資産とならない」と心配する経営者もいるかもしれませんが、この自由がメンバーが記事を書くことを促し、より会社のブランディングや採用につながるのではないかと考えています。コンセプトをもっと読む無料でお使いいただけます。詳しくはPublicationの使い方をご覧ください。エン', 'やPVを一覧することができます。Publicationに最大3つのサムネイル画像付きPRバナーを設置できます。また、Publicationに投稿された記事の中で特に目立たせたいものを常に上位に表示する「ピン留め」機能を使うことができます。株式会社SODAスニーカーやトレーディングカードの売買ができるフリマアプリ「スニーカーダンク」(通称:スニダン)。月間アクティブユーザー数が600万人と、スニーカーのフリマアプリで国内No.1の規模を誇る同サービスは、株式会社SODAの開発部約50人が運営しています。同社では2023年1月に、技術者のための情報共有コミュニティ「Zenn」の企業・組織向け機能「Publication」を用いて、自社テックブログ「SODA Engineering Blog」を開設。レバテック株式会社フリーランスや転職、新卒の領域でエージェントやスカウト、プラットフォームの各サービスを展開するレバテック株式会社。開発部では約50人の開発者がサービス開発・運営を担っています。技術広報の取り組みとして、2024年2月に技術者のための情報共有コミュニティ「Zenn」の企業・組織向', 'Zenn上にチームのメディアを開設しようPublicationに投稿された記事のヘッダーや本文下にはPublicationの情報が表示されます。メンバーが記事を書くことにより組織の認知度を高めることができます。ZennのPublicationにはシンプルなメンバーの権限管理が備わっており、メンバーを招待すればすぐに記事を書いてもらうことができます。投稿前にチーム内でレビューを行い、記事品質の向上に役立てることができます。レビュアーは本文の任意の箇所にコメントすることができます。コメントはスレッド化されるため、返信することもできます。Publicationに投稿された記事に最大3つのPRバナーを設置できます。それぞれにリンクとサムネイル画像を表示できます。魅力ある記事を投稿し、より興味のある読者に閲覧される可能性を高めてバナーを表示できます。統計ダッシュボードを活用し、長期的な投稿の継続やより読まれる記事執筆のための分析に役立てることができます。Publicationメンバー全員の執筆頻度やPVを一覧することができます。Publicationに最大3つのサムネイル画像付きPRバナーを設置']
  
Publication Proプランの価格は、月額9,980円、または年間99,800円(初回30日間無料)です。

シングルモーダルAI VS マルチモーダルAI

シングルモーダルAIの特徴

  • 単一種類の入力データから単一の出力結果を作成
  • 例:
    • テキスト質問に対して、テキストで回答するAI
    • テキストから画像、動画や音楽などを作成するAI
    • 画像内容をテキストで説明するAI
    • 手書き文字識別AI
    • 字幕起こしAI

マルチモーダルAIの特徴

  • 予め決められた複数種類入力データの組み合わせ<sup>※1</sup>から結果を作成
  • 例:
    • CSVファイルとテキストからデータ分析結果を作成するAI

※1 データの組合わせが複数の存在する場合、組合わせごとに訓練済みのAIモデルを用意する必要ある。違うシチュエーションで自動的に違うモジュールを使用させるには、LangChainなどでアプリケーション側での実装が必要。

ChatGPTはどっち?

gpt-3.5やgpt-4o等のLLMはテキスト処理に特化したAIモデルのため、シングルモーダルAIに属する。

一方で、最新のChatGPTでは、別のAIモデルや他のツールと組み合わせ、画像の読み取り、データファイルからのデータ分析、パワポ作成などの機能を提供できている。

なので、pythonでgpt-3.5やgpt-4o単体を立てる場合、単純のシングルモーダルAIになるが、ChatGPTは色んなAIモデルとツールを組み合わせしているため、単純のシングルモーダルAIではなくなる。強いて言えば、発展途上のマルチモーダルAIと言われているようである。

検証してみる

ChatGPT

ChatGPTで以下質問を聞いてみたら

このウエブページの内容を要約してください。「https://www.globalnote.jp/post-14946.html」

ChatGPTは以下の回答を生成した。

このページは、IMFによる世界の国別人口ランキングとその推移を提供しています。主要な統計データが含まれており、各国の人口の変動やトレンドを分析することができます。データはインタラクティブなグラフや表で表示され、ユーザーは特定の国や期間を選択して詳細な情報を取得できます。

詳細はこちらをご覧ください: 世界の人口 国別ランキング・推移

ChatGPTはサイトの中身まで参照して、回答を生成していると分かる。(APIクォーター)
ChatGPTにその裏の仕組みを聞いてみると、

ChatGPTがウエッブサイトを分析できたのはなぜですか?裏の仕組みを教えてください。

こう回答しました。

ChatGPTがウェブサイトを分析できたのは、OpenAIのブラウザツールを使って実際にウェブページにアクセスし、その内容を取得し、要約することができるからです。以下はその仕組みの簡単な説明です:

ブラウザツールの使用:

ChatGPTは特定のコマンドを使用して、指定されたURLにアクセスすることができます。これにより、ウェブページの内容を取得することができます。
内容の解析:

取得したウェブページの内容はテキストとして扱われ、ChatGPTはこのテキストを解析し、要約や特定の情報の抽出を行います。
情報の提示:

解析結果を基に、ユーザーが求めている情報を提供します。例えば、ウェブページの要約や特定のデータ(例:国別人口ランキングの3番目に多い国)などを提示します。
これらの機能は、AIの自然言語処理能力と、ウェブブラウジング機能の統合により実現されています。具体的な手順は次の通りです:

URLの受信:

ユーザーからURLを受け取る。
ウェブページへのアクセス:

ChatGPTがブラウザツールを使用してURLにアクセスし、ページの内容を取得する。
ページ内容の解析:

取得した内容を解析し、要約や特定の情報の抽出を行う。
結果の提示:

ユーザーに解析結果を提供する。
このプロセスにより、ChatGPTはユーザーが求める情報を効率的に取得し、提供することができます。

つまり、上記のサンプルコードでやっとことと同じくように、LLM単体で回答を生成するのではなくて、別のツールを利用することで回答を生成していた。

ちなみに、別のツールと併用してインターネット上で検索した内容を参照して回答しているが、サイトに含まれているテキスト情報だけ参照としているため、マルチモーダルAIとは言えない。同じ理由で、一般のRAGもマルチモーダルAIではないらしい。

gpt-4o

一方で、pythonでgpt-4oモデルを立てで同じことをやってみると

# 実行環境:Google Colab
from openai import OpenAI
import os
from google.colab import userdata

#OpenAIクライアント作成
os.environ["OPENAI_API_KEY"] = userdata.get("openai-key")
client = OpenAI(
    # This is the default and can be omitted
    api_key=os.environ.get("OPENAI_API_KEY"),
)

if __name__ == "__main__":
  question = f"""このサイトの内容を要約してください。
https://www.globalnote.jp/post-14946.html
  """
  response = client.chat.completions.create(
      model="gpt-4o",
      messages=[{"role": "user", "content": question}],
      max_tokens=1000
  )
  print(response.choices[0].message.content)

gpt-4oはこう回答してきた。

すみませんが、その特定のウェブサイトの内容を直接参照および要約することはできません。しかし、ウェブサイトの内容を理解し、要約するのに具体的な情報が必要なら、そのページの主なポイントや要約を書き出していただければ、その情報を元にお手伝いすることは可能です。リンク先のテキストをコピーして提供していただければ、要約を提供します。また、サイトに関する具体的な質問があればお答えしますので、お気軽にどうぞ。

gpt-4o単体ではエンターネット上の情報を検索して回答する能力は持たないと分かった。ちゃんとRAGでやったことをやらないとできない。

AIを利用したデータ分析手法

Data Analysis GPT(GPTsでカスタマイズされたChatGPT)

一般のチャットボットAIは、人間のように自然に会話する能力を備えています。一方で人間と同じように、次のような処理は苦手である。

  • 正確な計算
  • 大量のデータの集計

入力がテキストのみだと、Promptの文字数制限で大量データを渡せない。
その代わりに、直接AIにデータを分析してもらうのではなく、AIに分析環境や背景を伝えて、データ分析の仕方やPythonコードを書いてもらい、自分でコードを実行して分析を行うなど利用方式もある。(一般のChatGPT聞くのとどれほどの違いが出るかが理解できていないですが...)

■参考記事

https://zenn.dev/saka1/articles/632cc76e14f6fb

■記事概要

「Data Analysis GPT」というデータ分析に関して深い知識を持つファインチューニングされたChatGPTを使用し、手元の環境は自身の情報をAIに伝えながら、データ分析するために次のステップは何をすればよいかを聞いたり、分析用のPythonコードを作成してもらったりする。

いいところ

  • 導入しやすい

欠点

  • プロンプトが唯一の入力のため、テキスト以外のデータをAIに渡せない。データをテキストに変換しても、プロンプトの文字数制限で大量のデータを渡せない
  • 基本的にはAIに分析方式を教わるたけ、AIが直接分析してくれない。
  • AIにデータを渡さない場合、図表作成なども勿論できない。

※RAGは別の外部データを入力に使用しているように見えるが、実は検索した情報をコンテキストとして質問文と一緒にプロンプトに記載してAIに聞くだけなので、データ分析の面においては同じ制限がある

GPTsについては後続で紹介する。

ChatGPT - Improvements to data analysis in ChatGPT (旧Code Interpreter)


特徴

ChatGPTでは最近データ分析機能を提供し始めた。チャット画面からデータファイルをアップロードし、分析したいことを文章でAIに伝えると、ChatGPTが裏でPythonを利用して、データ分析、グラフ作成、資料作成をしてくれる。さらに作成した成果物もダウンロードできる。

利用できるデータソース:

  • Excel
  • CSV
  • PDFなど

データのアップロード方式:

  • パソコンから直接ファイルアップロード
  • Google Driveと連携
  • Microsoft OneDriveと連携

できること

  • 画像やExcelなどの外部データの読み込み・編集
  • 自然言語によるPythonコードの生成・実行
  • 自然言語のみでデータ分析
  • QRコードの生成
  • PDFの翻訳や要約
  • パワーポイントの作成
  • データのグラフ化

参考リンク:
https://openai.com/index/improvements-to-data-analysis-in-chatgpt/
https://trends.codecamp.jp/blogs/media/how-to-use-advanced-data-analysis

欠点

  • ChatGPTを使用するので、独自のシステムやアプリに統合できない
  • 分析してもらうにはChatGPTにデータファイルをアップロードする必要がある
  • ファイル形式のデータのみ対応。DB接続、APIなどでのデータ取得はできない

サービスの旧称

■Code Interpreter

「Advanced Data Analysis」の旧称

■Advanced Data Analysis

2023年に出たChatGPTでの有料プランのみ使えるデータ分析機能。2024年の最新のChatGPTでは更に改善された機能を提供されている。無料プランでも一部の機能が使えるようになった。

OpenAI - Open Interpreter

Code Interpreterのオープンソース版と言われている。ホストされているChatGPTサービスを使用する必要がなく、自分の環境でAIを使ってデータ分析できるため、ChatGPTの以下制限を回避できる

  • Python実行環境からインターネットに接続できない
  • Python実行環境はプリインストールされているパッケージに限られている
  • 最大アップロードは 100MB で、120 秒という実行時間制限がある
  • 生成されたファイルやリンクとともに状態がリセットされる

また、言語モデルのインポートにはlitellmを使用しており、gptclaudeなど100+のLLMを使用できる。

公式説明リンク:
https://github.com/OpenInterpreter/open-interpreter/blob/main/docs/README_JA.md

この記事で調べた範囲の中では、既存データ分析基盤などとの統合した自分のアプリを構築する場合一番使えそうな印象を持っている。

GPTsとは

特徴

  • ノーコードでChatGPTをカスタマイズできる
  • カスタマイズしたモデルを「Only me」、「Only people with a link」、「Public」三つの公開範囲を設定できる。
  • 開発したGPTを「Public」にして収益化もできる。
  • ChatGPT有料プランのみ作成と使用が可能
  • 外部サービスとAPI連携できる

Data Analysis GPTで紹介した方式でデータ分析に利用できるが、外部APIと連携できるカスタムアクション機能があるから、既存のシステムと結合したり、ChatGPTのようなファイルアップロード方式でのデータ分析よりもっとデータ分析に活用できるように見える。

参考リンク

https://www.skillupai.com/blog/ai-knowledge/about-gpts/

LLMアプリケーションの実装手法

LangChainについて

LangChainはLLMアプリの開発を簡単にするためのライブラリである。色んな便利機能を提供しており、今のLLMを使用してアプリ開発では主流のライブラリの一つである。

機能例

  • 言語モデルのインポート:OpenAI、Google Gemini、AWS Bedrock、AWS、Kendraなど多数のモデル間で切り替える(モデルインターフェースの抽象化)
  • プロンプトテンプレート
  • チェーン:さまざまなデータソースへの接続など、LLMを他のコンポーネントと組み合わせ、一連の関数を実行することでアプリケーションを作成。
  • インデックス:外部データを用いて、回答を生成する(RAGの実装)
  • メモリー:過去の会話の長期記憶。(前の会話をベースに次の回答を作成)
  • Agents:数式演算、検索エンジンの利用、特定のデータベースへのアクセス、特定のAPIの呼び出しなど、「言語モデルに渡されたツールを用いて、モデル自体が、次にどのようなアクションを取るかを決定・実行・観測・完了するまで繰り返す機能」

対応言語

Python、TypeScript

参考リンク

記事

https://aws.amazon.com/jp/what-is/langchain/
https://www.ibm.com/jp-ja/topics/langchain

https://zenn.dev/umi_mori/books/prompt-engineer/viewer/langchain_overview

Discussion