Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Amazon Bedrock で Titan Image Generator を使って画像生成

今度、寝台列車で旅行に行きたいな、と思って先日予約に挑んでみたのですが、残念ながら予約競争に敗北してしまった、菅野です。 寝台列車は、今も人気が高いんですね。

ChatGPTでもDALL·E 3を用いることが出来るようになるなど、生成AIでも画像生成や読み込みなど一般的に用いられるようになってきました。
Amazonで利用できる生成AIプラットフォーム、Amazon Bedrokでも、以前から画像生成モデルとして世界的にも最も有名なStability AIが提供するStable DiffusionSDXLモデルを用いた画像生成が可能でしたが、 AmazonオリジナルのモデルTitanからも画像生成を行えるモデル、Titan Image Generatorも利用できるようになっています。
今回は、Titan Image Generatorを用いて実際にどのような画像生成ができるのかを見ていきましょう。

docs.aws.amazon.com

Titan Image Generatorとは

Amazonが提供する画像生成のモデルで以下のような処理を実施できます。

機能 説明
Text2Image テキスト入力から画像を生成する
インペインティング 画像の一部だけを書き換える
アウトペインティング 画像の外側を追加する
画像バリエーション 画像とプロンプトを入力し、入力画像のスタイルや背景を変更する

モデルの仕様は以下になっています。

項目 内容
モデルID amazon.titan-image-generator-v1
最大入力文字数 1024文字
最大入力画像サイズ 50MB
イン/アウトペインティングを使用する場合の最大画像サイズ 1024*1024ピクセル
画像バリエーションを利用する場合の最大画像サイズ 4096*4096ピクセル
言語 英語
出力タイプ 画像
サポートされている画像タイプ JPEG、JPG、PNG

まだ日本語は未対応みたいなのでプロンプトは英語で入力する必要がありそうです。

Titan Image Generatorの利用方法

それでは早速Titan Image Generatorを利用してみましょう。

モデルのアクティベート

Bedrokのモデルアクセスタブから開いた画面の、モデルアクセスを管理ボタンを押下します。

Titan Image Generator G1モデルにチェックを入れます。

同画面下部の変更を保存すると、モデルが利用できるようになります。

実際の利用

Amazon Bedrokでは利用できるモデルを簡単に試すことが出来るプレイグラウンド機能を提供してくれている為、そちらを利用して実際にTitan Image Generatorを利用してみましょう。
左側メニューのプレイグラウンド>イメージを押下して開いた画面のモデルを選択ボタンを押下します。

プロバイダをAmazon、モデルを Titan Image Generator G1に選択し適用を押下します。

これで Titan Image Generatorを利用する準備が整いました。

text2imageを試してみる

まずはシンプルにプロンプトから画像を生成してみましょう。

表示された、画面の下部からプロンプトを入力して実行ボタンを押下します。
今回はA modern architectual building with large glass windwos, situated on a cliff overlooking a serene ocean at sunset.(夕暮れ時の穏やかな海を望む崖の上に建つ、大きなガラス窓を備えたモダンな建築の建物。)と入力してみました。
およそ1分程度の時間がかかりますが、以下のように画像が生成されます。

デフォルトの設定では1024*1024ピクセルの画像が1枚生成されます。

入力した文字列を忠実に再現した画像が生成されました。
写実的な表現をするような命令文を入れていないにもかかわらず、本当に存在しそうな画像が出てきましたね。

インペインティングを試してみる

つづきまして、入力された画像の一部のみ変更するインペインティングを試してみます。
右側のメニューから、モードをEditに変更、変更したい写真を推論イメージからアップロードして変更したい箇所にマスクの矩形を移動し、プロンプトに変更内容を入力して、実行を押下します。
先ほど出力された画像に、雲を追加してみましょう。

プロンプトにはadd cloud(雲を追加)と入力しました。

夕焼けの印影に合わせて雲が追加されました。
指定した範囲外は元の画像のままになっています。

アウトペインティングを試してみる

お次は、入力画像の対象物体以外を置き換えるアウトペインティングです。
再度、text2imageで作った画像に加工を加えてみましょう。

Editモードのまま、変更したい写真を推論イメージからアップロード、マスクの矩形を画面全体に適応し、マスクプロンプトにsea(海)と入力します。
プロンプトにsea of trees(樹海)と入力して、実行ボタンを押下します。

海がうっそうと生い茂る森に代わりました。

画像バリエーションを試してみる

アップロードした画像とプロンプトをもとに、投入した画像のバリエーションを出力します。
モードをGenerateに戻し、推論イメージにバリエーションを作成したい画像をアップロードします。
text2imageで作った画像をアップロードし、同じ雰囲気の画像を作ってもらいましょう。

一分ほどで画像が生成されました。
配置自体は変わっていますが、建物の雰囲気や、海の中の岩礁など、同じような画像が生成されています。

推論イメージ無しで三枚出力したものと比較すると、より同じテイストになっていることがわかります。

まとめ

Amazonが作成して画像生成モデルTitan Image Generatorを実際に使ってどのような出力をすることが出来るか試してみました。
Stable DiffusionのSDXLとは異なり、いわゆる呪文のようなプロンプトなしで写真ライクな画像を簡単に生成できる点は強みであると感じました。
今後も生成AIでどういったことが出来るのか調査していこうと思います。

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com

旅行先を提案してくれる、『Travel Buddy』をGPT Storeに公開しました

こんにちは、igaです。

突然ですが、皆さんはどれくらい旅行に行くことがあるでしょうか?
私は昨年、あるアニメの舞台になった場所に、10回旅行しました。

このように、目的をもって旅行する場合もありますが、「どこかに旅行に行きたいな」と考えることがあると思います。
ただ、旅行の目的として景色やグルメ、などは思いついてもどこに行けばそれが楽しめるのか分からない人もいるのではないでしょうか。
そのような方にお勧めの『Travel Buddy』を今回は紹介します。

『Travel Buddy』とは?

概要

『Travel Buddy』は旅行ガイドのようなGPTになります。
こちらは、うちの社員随一の乗り鉄である、Sawaさんが作ったGPTです。

旅行の目的を入力すると、『Travel Buddy』が必要な情報を聞いてくるので、それに対して回答していきます。
すると、これまで入力した条件に合った目的地を提案してくれます。

chat.openai.com

使い方

Travel Buddyに対して、旅行の目的を入力します。

すると、Travel Buddyから出発地についての情報を入力するように言われるので、出発地を入力します。

続いて日程や利用する交通機関など、Travel Buddyからの質問に対して、回答を入力していきます。
最終的に、Travel Buddyから候補地が提案されました。

候補地から希望の場所を選択すると、モデルコースを提案してくれます。
今回は、金沢を選択してみました。

すると、移動方法や金沢での行先などを提案してくれました。
おすすめされた場所をGoogle Mapに書いてみると、次のようなルートになりました。
ルートを引いてみましたが、近いところなので歩いて回れそうです。


まとめ

今回は、旅行先の提案をしてくれる『Travel Buddy』を紹介しました。
連休などで旅行に行きたいと思った時に使ってもらえると嬉しいです。



Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

www.wantedly.com

AI王で準優勝を獲りました

皆さんこんにちは
機械学習チームYAMALEX@tereka114です。
YAMALEXは Acroquest 社内で発足した、会社の未来の技術を創る、機械学習がメインテーマのデータサイエンスチームです。
(詳細はリンク先をご覧ください。)

1月26日(金)に最終報告会が開催されたAI王の問題作成部門でYAMALEXチームが準優勝しました。
今回のブログでは、そのAI王について執筆します。先に一言感想ですが、最高に面白かったです。

問題作成部門準優勝賞状

AI王とは

「AI王」は、日本国内の質問応答研究を促進させることを目的とした、日本語のクイズ問題を題材とした質問応答システムのコンペティションです。
今年で4回目の開催となり、「早押し解答部門」と「問題作成部門」があります。
どちらも新設の部門であり、昨年までクイズに回答するだけでしたが回答にも早押し要素が追加されています。
また、LLMなどの流行もあるためか、クイズの作問をする「問題作成部門」も新設されました。

sites.google.com

私たちの取り組み

今年YAMALEXチームは問題作成部門に参加しました。
問題作成部門は、予選・本選・最終報告会のエキシビションとあります。

予選は足切り、本選の上位3チームが最終報告会のエキシビションに出場できます。
このエキシビションの結果に基づいて、審査員が更に評価し、本選のスコアに加算され最終的な結果が決まります。

問題作成のために色々と取り組み、なんと、本選では1位に!これは自分たちもうれしくなりましたね。

私たちのソリューションはGPTを利用して、問題の作成と評価を繰り返し、徐々に改善していくといったことに取り組みました。
取り組む上で、評価指標の数値の理解が難しく、チーム内でこれはなぜ7点なのかを検討するなど、活発に議論しました。
LLMの生成結果の評価が難しいといったことにコンペで直面し、色々と検討を重ね改善していきました。

YAMALEXチームのソリューション概要

最終報告会

今年の最終報告会はオンラインではなく現地開催により非常に面白かったです。
午前中は「早押し解答部門」と「問題作成部門」それぞれの上位チームからの解法紹介。
全体を見ても各参加者が異なるアプローチを取っており、多種多様な解法を聞くことができ、面白かったです。

そして、午後はエキシビションマッチが開催されます。今回のエキシビションマッチは2つあります。

1. 「早押し解答部門」:AIと人間が早押しクイズで対戦
2. 「問題作成部門」:AIが作成したクイズを人間が解く

今回特に盛り上がったのは早押し解答部門で、AIと人間のギリギリの戦いが見られます。
結果は動画を見てみると面白いと思います。動画はこちらです。
また、当チームの解法を1時間54分あたり〜10分少々説明しておりますので、こちらも興味があればぜひ御覧ください。

www.youtube.com

問題作成部門最終結

そして、最後のエキシビジョンでどうなるか?残念ながら、ここで逆転され、2位になってしまいました・・・。
1位になれないのは悔しくもありますが、納得の結果です。
本選までの採点は体裁が成り立っているかを重視されていたのでその点は抑えていたのですが、最終報告会はクイズとしての面白さが必要でした。
考慮しようとは考えましたが、クイズへの理解度が足りず、より面白いものを作るのは難しいと思いました。

なお、問題作成部門でAIが作問したクイズは、審査員によれば高校1年生の7月ぐらいの力量で作成したクイズの質程度とのことです。
まずは高校1年生の夏休み後にするのが、来年に向けての課題なのかなと痛感しています。

出場してよかったこと

プロンプトを使う上での学び

問題作成部門を実施するにあたり、GPT3.5とGPT4を使っていましたが、プロンプトを利用する上での学びが多かったです。
プロンプトでただ単純に問題を作成するといっても構造や文体の指定がなければ、正しく生成されないなど、試行錯誤が続きました。

作成したクイズをプロに解いてもらえる貴重な体験

また、エキシビションマッチで自分たちの問題がクイズのプロの方々にどんな感じで解かれるのか最終報告会前から非常に興味深いものでした。
こんな経験ができるAIエンジニアも滅多にないと思うので、自分の作ったものの良し悪しがどう評価されるのかやはりワクワクでした。

クイズに対する解像度が参加前後でかなり上がったと思いました。自分の想像していなかった要素も多分にあり、学びになりました。

最後に

AI王というイベントのリアルには初参加しました。
会の中でエキシビションマッチやクイズの奥深さを感じることができ、非常にワクワクです。
来年も開催されましたら、対戦よろしくお願いします。

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Grandmasterと一緒に働きたエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの採用 - Wantedlywww.wantedly.com

どんなトピックでも常識チェック!『ニャンでも常識テスト』をGPT Storeに公開しました

こんにちは、安部です。 まだまだ寒い日が続きますが、皆さま元気にお過ごしでしょうか。

以前このブログで、作成したGPTのご紹介をしましたが、今回はその第二弾として新たに作成したGPTの紹介をしたいと思います。 第一弾で紹介したGPTについては、以下のブログ記事を参照してください。

acro-engineer.hatenablog.com

『ニャンでも常識テスト』とは?

概要

今回作成したのは、『ニャンでも常識テスト』。

こちらからテーマを与えれば、どんなテーマでも基本的知識を問う問題を10問出題してくれます。

また、採点もしてくれて、不明点があれば当然質問して補足説明・解説をしてもらうことができます。

自分の常識を試してみてもよし、ちょっとした集まりでお遊びに使ってもよし、学習中の分野に関して 腕試しに使ってみてもよしと、様々な使い方ができると思います。

chat.openai.com

使い方

使い方は簡単で、まずはGPTを開きましょう。

次に、テストにしてほしいトピックを指示します。今回は「統計」についてテストしてもらいましょう。

少しだけ待って、「出題してください」や「始めてください」というようにテスト開始を促すと、テストを開始してくれます。

回答を進め、10問回答し終わると採点結果を表示してくれます。

解説をお願いすれば、詳しく説明してくれます。今回は第10問、p値についての間違えについて解説してもらいます。

このように、簡単に 常識テスト → 採点 → 解説 をしてもらえるので、ぜひ皆さんも遊んでみてください。

もちろん、学問的なこと以外でもテストを作成してくれます。

まとめ

今回は、新たに公開したGPT『ニャンでも常識テスト』のご紹介をしました。 触ってみてもらえると嬉しいです。

GPT Storeが公開され、簡単にGPT作成・公開ができるようになったので、どんどん面白いアイディアを実現したいですね。 それでは。

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com

日常をすべて猫に変換、『にゃんだふるGAI』をGPT Storeに公開しました。

最近肌寒い日々が続きますね、暖冬はどこへ行ったのやら。。菅野です。

ChatGPTを利用してGPTを誰でも簡単に作成できるサービス、GPTsが公開されてから早くも二か月が経過しようとしています。
私自身も様々なGPTの作成を試してきましたが、今回、ついにそれらのGPTを公開できるGPT Storeが公開されました。

openai.com

さっそく私もアプリを公開してみたので、GPT Storeの紹介をしつつ、どのようなGPTを作ったかを紹介していこうと思います。
GPTsでどのようにアプリを作成するのかは以下のブログ記事を参照して下さい。

acro-engineer.hatenablog.com

GPT Storeとは

ユーザが作成した様々なGPTを公開するためのプラットフォームです。 アクセスするにはChatGPTの有償サブスクリプションChatGPT Plusに加入している必要があります。
ChatGPTのサイドメニューのExplore GPTからアクセスできます。

2024年第一四半期にはGPT作成者への収益化プログラムが導入される予定とのことです。

GPT Storeの画面は以下のようになっており、検索バーでGPTを検索できます。

また、カテゴリごとに人気のGPTsが表示されたりもしています。

作成したアプリのGPT Storeへの公開方法。

GPTsで作成したアプリの保存ボタンを押下し、公開先を公開に設定することでGPT Storeに公開することが出来ます。

公開したGPTには作成者の情報が表示されますが、こちらは支払者情報の名前や、設定したWebページの情報が表示されます。

早速、GPT Storeにアプリを公開してみました。
その名も『にゃんだフルGAI』です。

『にゃんだふるGAI』とは?

概要

突然ですが、ネコって見ているだけで癒されますよね?
目に入る景色のすべてがネコになったら幸せだとおもいませんか?
そんな夢をかなえるアプリを作成しました。
様々な画像をアップロードすると、それをネコに変換してくれるアプリです。
人も、犬も、鹿も狸も全部ネコに代わります。
動物がいない風景画像にはネコを登場させてくれます。

chat.openai.com

使い方

使い方は簡単、ネコに変換したい画像、ネコを登場させたい画像をアップロードして
「この画像をネコ化して」や、「この画像にネコを登場させて」と投稿するだけで自動でネコ化加工をしてくれます。

顔を手で覆っている人の画像をネコ化してみましょう。

ポーズも再現してくれていますね。

次は、驚いている女性の画像をネコ化してみましょう。

手のひらを向けているポーズが再現されているだけではなく、手にスマートウォッチを付けているところまで再現されていますね(向きが変わっていますが)

こんな感じに様々な画像をネコ化できます。
GPT Storeにてにゃんだふるで検索するとヒットするのでぜひ皆さんも遊んでみてください。

まとめ

今回はGPTsを利用して作成したGPTを公開することが出来るプラットフォーム、GPT Storeの紹介と、公開方法を紹介しました。
様々なアプリが公開されているので皆さん是非いろいろ試してみてください。
また、私が作成した『にゃんだふるGAI』も触っていただけると嬉しいです。
それでは、また。

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com

Amazon BedrockのKnowledge baseで簡単にRAGを構築

ポトフがおいしい季節ですね、菅野です。

Amazon BedrockのKnowledge baseがGAとなり、Amazon BedrockでもRAGが作成できるようになりました。

docs.aws.amazon.com

今回はKnowledgeベースを実際に作成して統計データを検索するRAGを構築してみます。

RAGとは

RAGアーキテクチャ(Retrieval-Augmented Generation)は、自然言語処理において、Google検索のような検索技術と、ChatGPTのような文章生成技術を組み合わせた技術です。
このアーキテクチャを利用すると、生成AIが学習していないデータ、例えば自社の内部レポートのようなデータを用いて、ChatGPTライクな応答システムを構築できます。
具体的には、何か質問を受けると、質問に関連した文章を検索し、その検索結果を元に自然となるような回答を生成する方法を採用しています。

Knowledge baseとは

Knowledge baseの概要

Knowledge baseは、Amazon Bedrockで簡単にRAGを実現するためのサービスです。 次のように動作します。

前処理

まず前処理として、回答生成のためのデータを読み込みます。

ユーザーが回答生成時に参照させたいドキュメントのファイル一式を、S3にデータソース(図中のData Source)として登録します。
Knowledge baseはドキュメントをチャンクに分割(Splitting int chunks)、埋め込みモデル(Embedding Model)を用いてベクトル変換(Generating Embeddings)します。その結果をベクターDB(Vector DB)に保存します。
このようにすることで、次段の質問処理で、質問文と関連のある文章をスピーディーに検索することができるようになります。

質問処理

Knowledge baseは、ユーザの質問(User Query)を受け取ったら、前処理に使ったのと同じ埋め込みモデル(Embedding Model)を用いて質問をベクトル変換(Generating Embeddings)し、この質問文のベクトルと前処理で構築したベクターDBにあるベクトルたちと比較することで、質問文に一番近いドキュメントを引き当てます(Retrieve similar documents)。
文章モデル(Text Model)は、この引き当てられたドキュメントとユーザの質問文を拡張して(Augment User Query with retrieved documents)、ユーザへの応答を生成し、返します(Respond to User) 。

詳細はAmazonの公式ページをご覧ください。

利用できるデータ、データ容量制限

利用できるデータは以下の形式になります。

  • .txt
  • .md
  • .html
  • .doc/.docx
  • .csv
  • .xls/.xlsx
  • .pdf

調べたり使ったりしてみたところ、次のような動きでした。

項目 内容
容量 1ファイルにつき最大50MBまでの制限があります。
全体での容量制限はない模様です。
ディレクトリ階層 ディレクトリ階層を作ってアップロードしても、階層をたどって読み取ってくれます。
日本語対応 日本語でデータを登録して検索させることも可能です。
複数のファイル 質問のターゲットとなるようなファイルが複数あってもそれぞれに対して検索を実行してくれるようなので、ファイルの事前の結合処理なども不要なようです。
利用できるリージョン 現時点ではバージニア北部(us-east-1)、オレゴン(us-west-2)の二か所のみ対応しています。
利用できる言語モデル 現時点では、Anthropic Claude Instant v1、Anthropic Claude v2.0の2モデルが対応しています。

Knowledge base の構築

それでは実際にKnowledge baseを作成してみましょう。

利用するデータ

今回は、IPAが公開している以下の資料でKnowledge baseを作成していきます。

デジタルスキル標準 Ver.1.1
https://www.ipa.go.jp/jinzai/skill-standard/dss/ps6vr700000083ki-att/000106872.pdf

安全なウェブサイト運営にむけて

https://www.ipa.go.jp/security/todokede/vuln/ug65p90000019gda-att/000089537.pdf

上記pdfをダウンロードし、S3に以下のようなディレクトリ構造で配置します。

├─スキル
│      デジタルスキル標準.pdf
│
└─セキュリティ
        企業ウェブサイトのための脆弱性対応ガイド.pdf

Knowledge baseでは指定したバケット内を探索してデータを登録するため、上記のようにディレクトリ構造を作成しても全ファイルを対象として取得できる模様です。

データの中身は以下のようになっています。

Knowledge baseの作成

Bedrock画面の、Orchestration>Knowledge baseから、Create knowledge baseを選択します。

Knowledge baseの詳細入力画面が出てくるのでそれぞれ以下の情報を入力しNextをクリックします。

項目 必須 入力内容
Knowledge base name 作成するKnowledge baseの名前
Knowledge base description 作成するKnowledge baseの詳細説明
Runtime role 既存のロールを選択するか、新規のロールを作成する
Agent resource role Agentが利用するAWSのIAM Roleを自動で生成するかあらかじめ作成したIAM Roleを用いるかを選択
Service role name ○(自動で生成を選択した場合) 作成するRole名
Service role name ○(既存のロールを利用するを選択した場合) 利用するRole名を選択
Tags 生成されるAWSリソースへのタグ

データソースの定義を入力してNextをクリックします。

項目 必須 入力内容
Data source name 作成するデータソースの名前
S3 URI 利用するS3バケットを選択

ベクターDBの設定項目を入力してNextをクリックします。

項目 必須 入力内容
Embeddings model 埋め込みモデル(現時点ではTitan Embeddings G1以外選択不可)
Vector database 新規のベクターDB作成か、既存のベクターDBを利用するか選択

新規のベクターDBを作成をするとOpenSearch Serverlessのインスタンスが作成されます。 こちらのインスタンスはKnowledgeBaseを削除しても残り続け、料金が発生し続ける為検証が完了したら直接OpenSerch Serverlessのコンソールに移動して削除を忘れないようにしましょう。

プレビューで今まで入力した情報が表示されるので、確認後Create knowledge baseを押下します。

無事Knowledge baseが作成されました、動作確認をする前にData sourceとのSyncを忘れずに実施しておきましょう。

このタイミングでTitan Embeddings G1モデルの利用申請をしていないとエラーになるので、Model Accessから申請をしておきましょう。

Knowledge baseを利用して文章を生成する

Knowledge baseのsyncが完了すると、Testボタンが表示されるようになります。
Testボタンを押下すると、テスト用のチャット欄が表示されます。

文章生成に利用するモデルを選択し、問い合わせのメッセージを入力しましょう。

出力された回答の括弧を押下すると、出典データが表示されます。

Show detailsで詳細データも確認することができます。

複数PDFに跨る検索も可能なようで、それぞれpdfのこの部分を要約して応答を作成してくれてますね。

まとめ

Amazon BedrockのKnowledge baseを利用してマネージドなRAGを作成しました。
エクセルファイルや、pdf、HTMLなど様々な形式のファイルをデータソースに設定できるので手軽に社内ドキュメントの検索タスクを生成AIに組み込んだりしていくことが出来そうです。
今後も生成AIの可能性を模索していきます。

Acroquest Technologyでは、キャリア採用を行っています。
  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSクラウドサービスを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
  少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。 www.wantedly.com

ElasticsearchのANNを利用して100万件のベクトル検索を高速化!

この記事は Elastic Stack (Elasticsearch) Advent Calendar 2023 18日目の記事です。

こんにちは。
Acroquestのデータサイエンスチーム「YAMALEX」に所属する@shin0higuchiです😊
YAMALEXチームでは、コンペティションへの参加や自社製品開発、技術研究などに日々取り組んでいます。

さて、最近はLLMの発展に伴ってRAG(Retrieval-Augumented Generation)が盛んに活用されています。
その中で、キーワードベースの検索だけでなくベクトル検索を併用するケースが多く見られ、実際にElasticsearchが利用されているケースも多く目にします。そのため、Elasticsearchのベクトル検索に興味を持っている方も多いと思います。今回の記事では、Elasticsearchのベクトル検索の速度などを、簡単に計測してみました。

概要

検証環境のOS/ミドルウェアバージョン

OS/ミドルウェア バージョン 備考
Elasticsearch 8.11.3
Kibana 8.11.3
OS Ubuntu 22.04.3LTS CPU 32コア, RAM 128GB。データ投入は別のWindowsマシンから実施

今回は以下の想定で検証を実施してみました。
RAGでよく用いるOpenAIのEmbeddingを用い、100万件の文章のベクトルをESに投入したと仮定して、その検索速度を計ってみたいと思います。
なお、OpenAIのEmbeddingを利用してベクトル化すると、各文章は1536次元のベクトルになります。

検証

インデックスのセットアップ

まずはデータを入れるためのインデックスにデータ型の定義を実施しておきます。
ここではシンプルに `vector` というフィールドのみを定義します。dense_vector型を指定し、1536次元を指定します。(上限はVer.8.11現在では4096次元です)

PUT single_vector_test
{
  "mappings": {
    "properties": {
      "vector": {
        "type": "dense_vector",
        "dims": 1536
      }
    }
  }
}

データ投入

データ投入にはLogstashを用います。
以下のような設定ファイルを作成して利用します。

input {
  file {
    path => "//pc-shin-gpu1/share/data/single_vector.txt"
    start_position => "beginning"
    sincedb_path => nul
  }
}

filter {
  mutate {
    rename => {"message" => "vector"}
  }
  json {
    source => "vector"
    target => "vector"
  }
  mutate {
    remove_field => ["message", "host", "path", "@version"]
  }
}

output {
  elasticsearch {
    hosts => ["https://pc-shin-gpu1:9200"]
    index => "single_vector_test"

    # ここでは検証を簡単化するためにSSLの検証をスキップさせたり、elasticユーザを利用しています。
    # 本番で利用する際は、SSLの設定を適切に行い、API Keyの利用なども検討してください。
    ssl_verification_mode => "none" 
    user => "elastic"
    password => "XXXXX"
  }
  stdout { codec => dots }
}

読み込む対象のデータは single_vector.txt に以下のようなフォーマットで保存されている前提です。

[2,31,0,212,6,.....,23] #1536次元
[83,11,5,0,0,.....,98]
....

Elasticsearch上でのデータ確認

Cat Indices APIで件数を確認してみます。1,000,000件入っていることが確認できます。
(レプリカ数)

# GET _cat/indices/single_vector_test?v

health status index              uuid                   pri rep docs.count docs.deleted store.size pri.store.size dataset.size
green  open   single_vector_test kNg4GFrKSzKrChb8EELNxA   1   0    1000000            0     33.4gb         33.4gb       33.4gb

検索処理

Elastisearchには正確に近傍検索をおこなう kNN と、近似計算で高速に処理をする ANN の2パターンがサポートされています。

kNN
GET single_vector_test/_search
{
  "size": 10,
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      }, 
      "script": {
        "source": "cosineSimilarity(params.queryVector, 'vector') + 1.0",
        "params": {
          "queryVector": [106, 142, 86, 87,...., 149]
        }
      }
    }
  }
}


500ミリ秒くらいかかっていますね。
(なお、32シャードに分割して同検証を実施すると170ミリ秒程度までは短縮されました)

{
  "took": 501,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 10000,
      "relation": "gte"
    },
    "max_score": 2,
    "hits": [
      {
        "_index": "single_vector_test",
        "_id": "9D6UdowBpziQa9Jus0xV",
        "_score": 2,
        "_ignored": [
          "event.original.keyword"
        ],
        "_source": {
          "@timestamp": "2023-12-17T07:01:43.527208800Z",
          "log": {
            "file": {
              "path": "//pc-shin-gpu1/share/data/single_vector.txt"
            }
          },
          "vector": [.....]
        }
      }
    ]
  }
}
ANN

一方ANNはこちら。

GET single_vector_test/_search
{
  "knn": {
    "field": "vector",
    "k": 10,
    "num_candidates": 100,
    "query_vector": [....]
  }
}


12ミリ秒と非常に高速に検索できていることがわかります。
ただし、あくまでkNNと違い近似の結果にはなるので、正確に類似度順に取得する必要がある場合は kNNを利用するようにしてください。

{
  "took": 12,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 10,
      "relation": "eq"
    },
    "max_score": 1,
    "hits": [
       ....
    ]
  }
}

まとめ

1536次元という比較的高次元なベクトルも、ANNを用いることでかなり高速に検索することができました。RAGに利用するという観点で言えば、検索結果の厳密性よりも高速にある程度の精度で類似検索ができるメリットは大きいように思います。
冒頭で触れた通り、キーワード検索とベクトル検索を併用できるElasticsearchはLLMの後ろで使うには非常に便利ですね。

ということで、今回の記事は以上となります。
お読みいただきありがとうございました。

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

 
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。

Kaggle Grandmasterと一緒に働きたエンジニアWanted! - Acroquest Technology株式会社のデータサイエンティストの採用 - Wantedlywww.wantedly.com