見出し画像

LlamaIndex + Gemini (共著:Jerry Liu, Haotian Zhang, Logan Markewich, Laurie Voss @ LlamaIndex | Dec, 2023 | LlamaIndex Blog

Clip source: LlamaIndex + Gemini. (co-authored by Jerry Liu, Haotian… | by Jerry Liu | Dec, 2023 | LlamaIndex Blog

LlamaIndexはGeminiへの連携を早くも発表。Google Labsとはかなり前から共同開発をしていたようですが、今や、マルチモーダル(テキスト、画像、映像を一緒に処理)が当たり前になりつつあるLLMですが、この辺はOpen AI/MicrosoftもAWSもまだ追いついていないところなので、年末から年明けはマルチモーダルAIの競争が激しくなりそうです。
マルチモーダルが可能になると嬉しいアプリはいっぱいあります。思いついたところで:

  • 写真のセマンティック分析(航空写真、建築写真、農業関係、医療系、など広範囲)

  • 画像の多いドキュメントのAI化(今時、写真/画像の無い文書の方が少ないし)

  • 地図の情報分析(ナビゲーションシステム、自動運転、等)

  • Augmented Reality系のアプリ(リアルタイムで取り込んだ映像とLLMとの連携)

もちろん、精度がどれだけ出せるか、は常に付きまとう課題なので、少々の間違い(ハルシネーション)があっても許されるアプリからの実装になるのでは、と想像します。
それにしても、LlamaIndex社は早いですね、こういうのが。。。


LlamaIndex + Gemini

Published in
LlamaIndex Blogにオリジナルを投稿
(co-authored by Jerry Liu, Haotian Zhang, Logan Markewich, and Laurie Voss @ LlamaIndex)

本日、Googleは最新のAIモデル「Gemini」を公開しました。Geminiの発売初日のパートナーとして、LlamaIndexでの即時サポートを提供できることに興奮しています!
0.9.15版のLlamaIndexは、現在リリースされているすべてのGeminiモデル(Gemini Pro、Gemini Ultra)および今後のモデルに対して完全サポートを提供します。私たちはテキスト入力/テキスト出力形式の「テキストのみ」Geminiバリアントと、テキストと画像の両方を入力とし、テキストを出力するマルチモーダルバリアントの両方をサポートしています。Geminiマルチモーダルインターフェースをサポートするために、根本的なマルチモーダル抽象化の変更を行いました。これにより、ユーザーはテキストと複数の画像を入力できます。私たちのGemini統合も機能完全で、(非ストリーミング、ストリーミング)、(同期、非同期)、(テキスト補完、チャットメッセージ)形式をサポートしており、合計8つの組み合わせが可能です。
さらに、まったく新しいSemantic Retriever APIもサポートしています。これはストレージ、埋め込みモデル、検索、LLMをRAGパイプラインにバンドルしたものです。それが単独でどのように使用されるか、またはLlamaIndexコンポーネントと分解+バンドルして高度なRAGパイプラインを作成する方法を示します。
初期アクセスの設定を支援してくれたGoogle LabsとSemantic Retrieverチームに大きな感謝を伝えます。
- Google Labs: Mark McDonald, Josh Gordon, Arthur Soroken
- Semantic Retriever: Lawrence Tsang, Cher Hu
以下のセクションには、LlamaIndexにおける新しいGeminiとSemantic Retrieverの抽象化に関する詳細なウォークスルーが含まれています。今すぐ読む気がない場合は、以下の詳細なノートブックガイドをブックマークしておいてください!
- Gemini(テキストのみ)ガイド
- Gemini(マルチモーダル)ガイド
- Semantic Retrieverガイド


Gemini リリースとサポート

Geminiに関する報道が多く、様々なベンチマークで印象的なパフォーマンスを発揮しています。まだ一般には公開されていないUltraのモデルcは、MMLUからBig-Bench Hard、数学やコーディングタスクまでのベンチマークでGPT-4を上回ります。そのマルチモーダルデモは、科学論文理解から文学レビューまでの分野で画像/テキストの理解できる能力を示します。

  • LlamaIndexでGeminiの使用例を紹介。

    • テキストモデルの使用例: (from llama_index.llms import Gemini)

    • マルチモーダルモデルの使用例:(from llama_index.multi_modal_llms.gemini import GeminiMultiModal)


テキストモデル

Full Notebook Guide Here
まずはテキストモデルから始めます。下記のコードでは、コンプリーション→チャット→ストリーミング→非同期 など、様々な設定を示す。

from llama_index.llms import Gemini
# completion
resp = Gemini().complete("Write a poem about a magic backpack")
# chat
messages = [
ChatMessage(role="user", content="Hello friend!"),
ChatMessage(role="assistant", content="Yarr what is shakin' matey?"),
ChatMessage(
role="user", content="Help me decide what to have for dinner."
),
]
resp = Gemini().chat(messages)
# streaming (completion)
llm = Gemini()
resp = llm.stream_complete(
"The story of Sourcrust, the bread creature, is really interesting. It all started when..."
)
# streaming (chat)
llm = Gemini()
messages = [
ChatMessage(role="user", content="Hello friend!"),
ChatMessage(role="assistant", content="Yarr what is shakin' matey?"),
ChatMessage(
role="user", content="Help me decide what to have for dinner."
),
]
resp = llm.stream_chat(messages)
# async completion
resp = await llm.acomplete("Llamas are famous for ")
print(resp)
# async streaming (completion)
resp = await llm.astream_complete("Llamas are famous for ")
async for chunk in resp:
print(chunk.text, end="")


もちろん、Geminiクラスには設定可能なパラメータがあります。これには、model_nametemperaturemax_tokensgenerate_kwargs.などが含まれます。
例えば、次のような事ができます。

llm = Gemini(model="models/gemini-ultra")



マルチモーダル モデル

Full Notebook Guide Here
このノートブックでは、マルチモーダル入力を特徴とするgemini-pro-visionバリアントをテストします。以下の特徴が含まれています:
- completechat機能の両方をサポート
- ストリーミングと非同期をサポート
- コンプリーションエンドポイントでテキストに加えて複数の画像を入力することをサポート
- 今後の作業:テキストと画像を交互に扱うマルチターンチャットは、抽象化内でサポートされていますが、gemini-pro-visionではまだ有効になっていません。
具体的な例を通して見ていきましょう。次のシーンの写真が与えられたとしましょう:

ニューヨーク市の通りのシーン
次に、Gemini Visionモデルを初期化し、質問を投げかけます:「この写真が撮影された都市を特定してください」。

from llama_index.multi_modal_llms.gemini import GeminiMultiModal
from llama_index.multi_modal_llms.generic_utils import (
load_image_urls,
)
image_urls = [
"<https://storage.googleapis.com/generativeai-downloads/data/scene.jpg>",
# Add yours here!
]
image_documents = load_image_urls(image_urls)
gemini_pro = GeminiMultiModal(model="models/gemini-pro")
complete_response = gemini_pro.complete(
prompt="Identify the city where this photo was taken.",
image_documents=image_documents,
)


レスポンスは下記の通り:

New York City

複数の画像を挿入することもできます。例えば、メッシの画像とコロッセオの画像を使用する例があります。

image_urls = [
"<https://www.sportsnet.ca/wp-content/uploads/2023/11/CP1688996471-1040x572.jpg>",
"<https://res.cloudinary.com/hello-tickets/image/upload/c_limit,f_auto,q_auto,w_1920/v1640835927/o3pfl41q7m5bj8jardk0.jpg>",
]
image_documents_1 = load_image_urls(image_urls)
response_multi = gemini_pro.complete(
prompt="is there any relationship between those images?",
image_documents=image_documents_1,
)
print(response_multi)



マルチモーダルユースケース(Structured Outputs, RAG)

Full Notebook Guide Here
構造化された出力の抽出からRAGまで、さまざまなマルチモーダルユースケースに関する豊富なリソースを作成しました。
Haotian Zhang氏のおかげで、これらのユースケースの例をGeminiを使って示しています。詳細については、私たちの詳細なノートブックガイドをご覧ください。現時点での最終結果は下記の通り。
Gemini Pro Visionを使用した構造化データの抽出

Googleマップのレストランリスティングのスクリーンショット
Output:

('restaurant', 'La Mar by Gaston Acurio')
('food', 'South American')
('location', '500 Brickell Key Dr, Miami, FL 33131')
('category', 'Restaurant')
('hours', 'Open ⋅ Closes 11 PM')
('price', 4.0)
('rating', 4)
('review', '4.4 (2,104)')
('description', 'Chic waterfront find offering Peruvian & fusion fare, plus bars for cocktails, ceviche & anticucho.')
('nearby_tourist_places', 'Brickell Key Park')


マルチモーダルRAG
複数のレストランの画像に対して構造化された出力抽出器を実行し、これらのノードをインデックス化し、次に質問をします:「オーランドのレストランを推薦して、その近くの観光地も教えてください」。

I recommend Mythos Restaurant in Orlando. It is an American restaurant located at 6000 Universal Blvd, Orlando, FL 32819, United States. It has a rating of 4 and a review score of 4.3 based on 2,115 reviews. The restaurant offers a mythic underwater-themed dining experience with a view of Universal Studios' Inland Sea. It is located near popular tourist places such as Universal's Islands of Adventure, Skull Island: Reign of Kong, The Wizarding World of Harry Potter, Jurassic Park River Adventure, Hollywood Rip Ride Rockit, and Universal Studios Florida.



セマンティク レトリーバ (Semantic Retriever)

生成言語セマンティックリトリーバーは、高品質な検索のための特別な埋め込みモデルと、安全設定で根拠のある出力を生成する調整されたLLMを提供します。
これは私たちのGoogleIndexを使ってすぐに使用することもできますし、異なるコンポーネント(GoogleVectorStoreGoogleTextSynthesizer)に分解し、LlamaIndexの抽象化と組み合わせることもできます。
詳細はここで→ semantic retriever notebook guide is here.


すぐに使える設定

また、数行でそのまま使うことができます。インデックスを定義し、ノードを挿入してから、クエリエンジンを取得するだけです:

from llama_index.indices.managed.google.generativeai import GoogleIndex
index = GoogleIndex.from_corpus(corpus_id="<corpus_id>")
index.insert_documents(nodes)
query_engine = index.as_query_engine(...)
response = query_engine.query("<query>")


Googleのクエリエンジンには、異なる回答スタイルと安全設定がサポートされているという特徴があります。
回答スタイル:
- ABSTRACTIVE(簡潔だが抽象的)
- EXTRACTIVE(簡潔で抽出的)
- VERBOSE(詳細な情報)
安全設定:
クエリエンジンで安全設定を指定でき、異なる状況での回答が明示的かどうかのガイドラインを定義できます。詳しくはgenerative-ai-pythonライブラリをご覧ください。
A cool feature here is that Google’s query engine supports different answering styles as well as safety settings.


異なるコンポーネントに分解して活用

GoogleIndexは、ベクターストア(GoogleVectorStore)とレスポンスシンセサイザー(GoogleTextSynthesizer)の2つのコンポーネントに基づいて構築されています。これらをLlamaIndexの抽象化と組み合わせて、高度なRAGを作成するためにモジュラーコンポーネントとして使用できます。
ノートブックガイドは、3つの高度なRAGユースケースを強調しています:

  • Googleリトリバー + リランキング:Semantic Retrieverを使用して関連する結果を返し、その後、レスポンス合成にフィードする前に結果を処理/フィルタリングするためにリランキングモジュールを使用します。

  • マルチクエリ + Googleリトリバー:複雑な質問を複数のステップに分解し、各ステップをSemantic Retrieverに対して実行する、MultiStepQueryEngineのようなマルチクエリ機能を使用します。

  • HyDE + Googleリトリバー:HyDEは、クエリから答えを幻覚し、その幻覚した答えを埋め込み検索に使用する人気のあるクエリ変換技術です。それをSemantic Retrieverからのリトリーバルステップの前のステップとして使用します。


結論

このブログには多くの情報がありますが、それでもこのブログ投稿は、今日公開した内容の半分も網羅していません。
是非、詳細なノートブックガイドをチェックしてください!再度リソースを以下にリンクします:

再度、GoogleチームとLlamaIndexチームのハオティアン・チャン、ローガン・マーケウィッチに、このリリースのために全てをまとめてくれたことに大きな感謝を伝えます。

この記事が気に入ったらサポートをしてみませんか?