🗞️

今週の生成AI情報まとめ(10/14~10/20)

2024/11/17に公開

こんにちは、ナウキャストでLLMエンジニアをしているRyotaroです。
10/14~10/20で収集した生成AIに関連する情報をまとめています。

※注意事項

内容としては自分が前の週に収集した生成AIの記事やXでの投稿・論文が中心になるのと、自分のアンテナに引っかかった順なので、多少古い日付のものを紹介する場合があります

それでは行きましょう

ひとこと

最近案件で多忙だったため、約1ヶ月遅れですがお許しを…

Google AI Studio にも Canvas 機能が!?

Google が AI Studio にて OpenAI の Canvas や Claude の Artifact に似た Canvas 機能を開発しリリース準備中という情報が X 上で話題に。

搭載されれば、左のメニューバーに出てくるよう。ただ現時点(11/17)でも出てきてな石、調べてもヒットしないのでまだ準備中のようですね。。

参考資料

https://x.com/testingcatalog/status/1845580654957748544

Weaviate: Multiple target vectors

9/17 に Weaviate が multi target vector search という機能を導入したとのこと。

この仕組みがなぜ出てきたか、どういうメリットがあるかはこの記事にとても詳しく記載されています

ざっくり話すと、まず Weaviate に Multiple vectors/Named vectors というベクトルデータベースの機能があり、QA のような同時に2つの側面を持つベクトル化したいデータがある時に、別々にベクトルデータベースに登録すると、管理が煩雑だし、アトミック性が失われてしまいます。要は1つのオブジェクトが複数の値を持ち、その値ごとにベクトル化し、検索をさせたいというニーズに答えることができるのがこの Multiple vectors/Named vectors です。

そして、この Multiple vectors/Named vectors でも、検索するときは別々に指定する必要があったのを、Multiple target vectors を使うことでシンプルに1回の検索で行うことができ、かつその結果の統合もモジュールに任せることができるようになるということ。(結構すごい)

実際に書くときは、以下のように target_vector に 複数のベクトルストアを記載します。

from weaviate.classes.query import MetadataQuery

collection = client.collections.get("JeopardyTiny")

response = collection.query.near_text(
    query="a wild animal",
    limit=2,
    target_vector=["jeopardy_questions_vector", "jeopardy_answers_vector"],  # Specify the target vectors
    return_metadata=MetadataQuery(distance=True)
)

for o in response.objects:
    print(o.properties)
    return_metadata=MetadataQuery(distance=True)

query も near_vector として複数指定することができ、このときは返り値が配列で返ってくるようになるそうです。

from weaviate.classes.query import MetadataQuery

collection = client.collections.get("JeopardyTiny")

response = collection.query.near_vector(
    # Specify the query vectors for each target vector
    near_vector={
        "jeopardy_questions_vector": v1,
        "jeopardy_answers_vector": [v2, v3]
    },
    limit=2,
    # Specify the target vectors as a list
    target_vector=[
        "jeopardy_questions_vector",
        "jeopardy_answers_vector",
    ],
    return_metadata=MetadataQuery(distance=True)
)

for o in response.objects:
    print(o.properties)
    return_metadata=MetadataQuery(distance=True)

さらに、それぞれのベクトル検索の結果の重みづけも可能

target_vector=TargetVectors.manual_weights({
  "jeopardy_questions_vector": 10,
  "jeopardy_answers_vector": 30,
}),

現状 Qdrant と OpenSearch しか使ってこなかったですが Weaviate もめちゃくちゃいいですね!

参考資料

https://x.com/weaviate_io/status/1836049352155926653
https://weaviate.io/developers/weaviate/search/multi-vector
https://zenn.dev/kun432/scraps/c7737e556578a1

ChatGPT の小技

ChatGPT で 「to=bio」というコマンドを使うことで、メモリを意図的に設定することができるそうです。

実際にメモリ設定を見てみると……

実際に有効活用したいときは、youtube を参考に独自のショートカットキーを登録しておくとか、よく使うプロンプトを入れておくのがよい使い方かなと思いました!

参考資料

https://note.com/shizuoka_life/n/n5da4494bb693
https://x.com/satotaku_ai/status/1845766592082387348

GestaltMML

GestaltMML は、希少遺伝性疾患の診断精度を向上させるために開発されたマルチモーダル機械学習モデルで、患者の正面顔写真、人口統計情報(年齢、性別、民族など)、および臨床的なテキストデータを統合的に解析して、遺伝的疾患の予測をします。従来の診断手法では、顔写真のみを用いた解析が主流だったところ、これでは限界があったため、複数のデータソースを組み合わせることで、より高精度に予測できるようになったとのことです。

アーキテクチャーは ViLT(Vision-and-Language Transformer)を基盤としており、テキストと画像の両方を処理できるトランスフォーマーエンコーダーを採用。これにより、顔写真と臨床テキストを統合的に解析し、希少疾患の診断精度を向上させています。特に、顔写真だけでは捉えきれない症状や特徴(例:低身長、睡眠障害、知的障害など)を、テキストデータと組み合わせることでより正確に把握できるそうです。

特にGestaltMMLは、トランスフォーマーアーキテクチャのみを使用しており、畳み込み処理を一切含まない点が特徴です。これに対し、他の画像のみのモデルではトランスフォーマーアーキテクチャは採用されていません。分析結果は下表のようになり、GestaltMMLが画像とテキストの組み合わせにより高い精度を達成していることが確認されました。

自分はビジネスにおける生成AIがおもですが、医療系にもインパクトしているのが面白いですねー
各分野で生成AIが活躍して欲しいです

参考資料

https://ai-scholar.tech/articles/large-language-models/gestaltmml

OpenAI Swarm

OpenAI Swarmは、OpenAI によって開発されたAIエージェントのネットワークを編成するための実験的なフレームワークです(10/12 に公開)。

(※ しかし、OpenAIの研究者は、swarmは公式のOpenAI製品ではなく、実験的なコードであり、本番環境での使用を意図しておらず、OpenAIによってサポートされないことを明確にしています。

実際のコード

見ればわかるように、コード量が圧倒的に少なく、実装できる点が非常に良さそうだと思いました!
基本

from swarm import Swarm, Agent

def transfer_to_faq():
    return faq_agent

def transfer_to_feedback():
    return feedback_agent

triage_agent = Agent(
    name="トリアージエージェント",
    instructions="""ユーザーのリクエストを分析し、最適なエージェントに転送してください。""",
    functions=[transfer_to_faq, transfer_to_feedback],
)

faq_agent = Agent(
    name="FAQエージェント",
    instructions="""ユーザーの質問に対して、適切な回答を提供してください。""",
)

feedback_agent = Agent(
    name="フィードバックエージェント",
    instructions="""ユーザーのフィードバックを受け取り、感謝の意を伝えてください。""",
)

client = Swarm()

response = client.run(
    agent=triage_agent,
    messages=[{"role": "user", "content": "商品の使い方がわかりません。"}],
)

Swarm を初期化する client に AzureOpenAI のクライアントを渡せば Azure 経由でも可能そう。

https://github.com/farzad528/azure-ai-search-python-playground/blob/main/azure-ai-search-openai-swarm.ipynb

中を見ると、client 指定しないときは OpenAI の client を呼んでいて、後続の completion は その client 経由なので、今のところ openai ライブラリではないと行けなさそう。つまり AzureOpenAI は行けても、Claude や Gemini は難しい。(OpenAI が開発したのだから当然と言えば当然……)

https://github.com/openai/swarm/blob/9db581cecaacea0d46a933d6453c312b034dbf47/swarm/core.py#L26

参考資料

https://github.com/openai/swarm
https://hamaruki.com/swarm-experimental-sample/
https://qiita.com/ryosuke_ohori/items/ab292301f6baecf42d13

Nvidia 発 Llama-3.1-Nemotron-70B-Instruct

Nvidia が 10/16 に Llama-3.1-Nemotron-70B-Instruct を発表しました。2024年10月1日時点ではGPT-4oやClaude 3.5 Sonnetよりもハイパフォーマンスだそう。実際にリーダーボードでは o1 に続いて3位に位置付けています。(10/16時点)

このモデルは、Arena Hard、AlpacaEval 2 LC、MT Benchなどのベンチマークで高いスコアを獲得しており、特にGPT-4oやClaude 3.5 Sonnetなどのモデルよりも良い成績を残しています。

トレーニングには、RLHF (REINFORCE)とHelpSteer2-Preferenceプロンプトが使用されており、初期ポリシーとしてLlama-3.1-70B-Instructモデルが採用。また、HuggingFace Transformersコードベースで利用できるように変換されたバージョン「Llama-3.1-Nemotron-70B-Instruct-HF」も提供されています。

HelpSteer2

HelpSteer2は、オープンソースのデータセットであり、大規模言語モデル(LLM)を人間の好みに合わせて調整するための高性能な報酬モデルを訓練するために設計されています。このデータセットは、元のHelpSteerデータセットの後継であり、CC-BY-4.0ライセンスの下で提供されており、研究および開発目的で自由に利用可能です。

データセットの各サンプルには、プロンプト、対応する応答、および5つの人間によるアノテーション属性(有用性、正確性、一貫性、複雑性、冗長性)が含まれています。これらの属性は0から4のスケールで評価され、スコアが高いほど各カテゴリでのパフォーマンスが優れていることを示します。

HelpSteer2の重要な特徴の一つは、マルチターンの対話に焦点を当てていることで、プロンプトの約29%がマルチターンの対話です。この構造により、会話の文脈を効果的に処理する必要があるモデルのより微妙な訓練が可能になります。データセットは21,362のサンプルで構成されており、好みベースのモデリングや回帰スタイルの訓練を含むさまざまな訓練方法に利用できます。

利用用途と可否

利用用途 可否
商用利用
改変
配布
特許使用
私的使用

参考資料

https://x.com/itsPaulAi/status/1846565333240607148
https://build.nvidia.com/nvidia/llama-3_1-nemotron-70b-instruct
https://weel.co.jp/media/tech/llama3-1-nemotron-70b-instruct/

ベクトル検索の文書内の情報の順番とヒット率

ベクトル検索ではある文章の塊をベクトル化しておき、クエリをベクトル化したものと付き合わせて類似度を測り、その値が高いものを関連性のある文章として取得します。そこで、ベクトルストアに入れておく文章がいくつかの文に分けられるとき、その順番がベクトル検索に対する影響があるかどうかを検証した方がいてかなり有益なので、その情報を共有します!

この例では、4つの文章に分けられる。

そこで、いろいろな文章に関して、それを構成するそれぞれの文章で検索を実行したところ、1文目の類似度が高く、だんだんと類似度は低くなっていく傾向にあることがわかったらしいです。

この投稿者によると、これは日本語でも英語でも見られる普遍的な挙動とのこと。

参考資料

https://x.com/yamazombie1/status/1846858726554378606

LLM as a judge

参考資料

Zerox

Zerox とは、OSSのライブラリで、マルチモーダルLLMを利用して、PDFなどのファイルをテキスト化する OCR ライブラリです。node.js と python で実行可能となっています。

複数モデルを利用可能にするために、以下のLiteLLMというライブラリを内部で利用しているようで、こちらでサポートされているマルチモーダルモデルは利用できそうです。OpenAI の gpt4o 、google のgemini、Anthropic の Claude などが選択肢になります。

ということで早速試してみました。他の PDF パースライブラリと比較するために pypdfpymupdf も install

poetry add py-zerox pypdf pymupdf
from pyzerox import zerox
import os
import json
import asyncio

###################### Example for Azure OpenAI ######################
model = "azure/gpt-4o-mini" ## "azure/<your_deployment_name>" -> format <provider>/<model>
os.environ["AZURE_API_KEY"] = "" # "your-azure-api-key"
os.environ["AZURE_API_BASE"] = "" # "https://example-endpoint.openai.azure.com"
os.environ["AZURE_API_VERSION"] = "" # "2023-05-15"

# Define main async entrypoint
async def main():
    file_path = "https://omni-demo-data.s3.amazonaws.com/test/cs101.pdf" ## local filepath and file URL supported

    ## process only some pages or all
    select_pages = None ## None for all, but could be int or list(int) page numbers (1 indexed)

    output_dir = "./output_test" ## directory to save the consolidated markdown file
    result = await zerox(file_path=file_path, model=model, output_dir=output_dir,
                        custom_system_prompt=custom_system_prompt,select_pages=select_pages)
    return result

# run the main function:
result = asyncio.run(main())

# print markdown result
print(result)

今回は AzureOpenAI の gpt-4o(0513)で試してみたところ、差は一目瞭然ですね。

決算資料でもやってみると…じゃっかん数字が拾いきれていないので、まだまだですがこの辺りは LLM を gpt-4o-0806 にしたり、gemini を使ってみたりと試してみると違うかもしれないです。

意外と出力も早かったので実用に耐えうるかなと思います。

参考資料

https://github.com/getomni-ai/zerox

We are Hiring!

この件についてもっと詳しく知りたい、議論したい、はたまたナウキャストという会社に興味を持ったという方は、カジュアル面談フォームから連絡ください。その際に「今週の生成AI情報まとめ見た!」と書いていただければ幸いです!

https://herp.careers/v1/finatexthd/vZWzSlI_B-qk
https://herp.careers/v1/finatexthd/KhEf95X_TKvD

Discussion