Taste of Tech Topics

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

旅行先を提案してくれる、『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

GPT-4Vのモデルを利用してOCRできるか試してみた

こんにちは、安部です。

気温の上下に翻弄されて最近風邪をひいてしまいましたが、皆さま元気にお過ごしでしょうか。

今回は、GPT-4Vのモデルを利用して、OCRができるか試していきます。

GPT-4Vによって、「ChatGPTに目ができた」などと騒がれましたが、文字認識はどれくらいできるのでしょうか? 得意分野ではなさそうですが、GPTも進化が目覚ましいので分かりませんね。

検証では、日本語(漢字/ひらがな/カタカナ)・英語の2言語で精度など比較していきます。 また、手書き・活字での違いも見ていきましょう。

一番簡単に試せるChatGPT(Web版)でOCRをさせようとするとエラーになることが多かったので、 ここではAPIを使っていくこととします。

APIを呼び出すプログラム

以下のコードを使い、gpt-4-vision-previewというモデルを呼び出しています。 画像は個人のgithubリポジトリにアップロードしておき、URLをモデルに渡します。 余計なことをして欲しくないので、読み取った文章のみを返答するよう指示します。

from openai import OpenAI

def main():
    client = OpenAI(
        api_key= 'API Keyを入れる'
    )

    response = client.chat.completions.create(
        model="gpt-4-vision-preview",
        max_tokens=1024,
        messages=[
            {
                "role": "system",
                "content": "You are an Optical Character Recognition (OCR) machine. You will extract all the characters from the image file in the URL provided by the user, and you will only provide the extracted text in your response. As an OCR machine, You can only respond with the extracted text."
            },
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": "Please extract all characters within the image. Return the only extracted characters."},
                    {
                        "type": "image_url",
                        "image_url": {
                            "url": "画像のURL",
                        },
                    },
                ],
            },
        ]
    )

    print(response.choices[0].message.content)


if __name__ == "__main__":
    main()

それでは、試していきましょう!

英語の活字を認識させる

まずは、一番簡単そうな英語・活字を認識できるか見ていきます。 題材は、チューリングの有名論文の最初の1ページです。

これを読み取らせる

読み取り結果は以下の通りです。間違っているところは赤い字にしています(ほとんどありませんが)。

ON COMPUTABLE NUMBERS, WITH AN APPLICATION TO THE ENTSCHEIDUNGSPROBLEM By A. M. TURING.

[Received 28 May, 1936.—Read 12 November, 1936.]

The “computable” numbers may be described briefly as the real numbers whose expressions as a decimal are calculable by finite means. Although the subject of this paper is ostensibly the computable numbers, it is almost equally easy to define and investigate computable functions of an integral variable or a real or computable variable, computable predicates, and so forth. The fundamental problems involved are, however, the same in each case, and I have chosen the computable numbers for explicit treatment as involving the least cumbrous technique. I hope shortly to give an account of the relations of the computable numbers, functions, and so forth to one another. This will include a development of the theory of functions of a real variable expressed in terms of computable numbers. According to my definition, a number is computable if its decimal can be written down by a machine.

In §§ 9, 10 I give some arguments with the intention of showing that the computable numbers include all numbers which could naturally be regarded as computable. In particular, I show that certain large classes of numbers are computable. They include, for instance, the real parts of all algebraic numbers, the real parts of the zeros of the Bessel functions, the numbers π, e, etc. The computable numbers do not, however, include all definable numbers, an example is given of a definable number which is not computable.

Although the class of computable numbers is so great, and in many ways similar to the class of real numbers, it is nevertheless enumerable. In §§ I examine certain arguments which would seem to prove the contrary. By the correct application of one of these arguments, conclusions are reached which are superficially similar to those of Gödel’s. These results

  • Gödel, “über formal unentscheidbare Satze der Principia Mathematica und verwandter Systeme I,” Monatshefte Math. Phys., 38 (1931), 173-198.

ほぼ、完璧ですね。 ウムラウトやセクションマーク(§)、πなどのギリシャ文字も読み取れています。 間違っているのは、"§8"が"§§"になっている点と、"Gödel † (ダガー記号)"が"Gödel’s"になっている点くらいでしょうか。

期待通り、英語の活字はかなりの精度で認識してくれました。

英語の手書き文字を認識させる

次に、手書き文字を認識させてみます。 あまり長い文章を書くのは大変なので、短い文章ですがご容赦ください。

以下の画像を読み込ませてみます。 "My handwriting is very legible, so you should be able to recognize it."と書いてあります、念のため。

読み取り結果は以下の通りです。

My handwriting's very legible, so you should be able to recognize it.

isが短縮形にされてしまっている点以外、正しく認識されています (グニャグニャの筆記体で書いたら精度が下がるのかもしれませんが)。

日本語の活字を認識させる

では、日本語の認識精度はどうでしょうか?

まずは短い文章を認識させてみましょう。

こちらの画像を読み込ませました。

読み取り結果はこちら。

高齢者がつまずきやすい文字が認識できるかをテストする。

やはり、日本語は難しいようです。 漢字だけでなく、ひらがなも読み違えていますね。

「認識」という文字が認識できているのに「大」が認識できないのは何故なんでしょうか...。

念のため、もう少し長い文章も試してみましょう。 オー・ヘンリーの有名短編小説「賢者の贈り物」の冒頭部分の日本語版キャプチャを読み込ませます。

読み取り結果はこちら。

1ドル87セント。それで頂点。しかしもそのうちの2セントは小銭でした。
小銭は一回の買い物につき一枚か二枚づつ減り続けたものです。乾物屋や小倉屋 や肉屋に無理強打はしませんでので、しまいに、こんなに値打あるという無 言の押売満腹分をはぼさせでした。デ回数えてみました。でもやっぱ
り1ドル87セント。明日はクリスマスだというのに。

これでは、またくのところ、精神性な小子に窮しちまいかも試練です
ですからデはそうしませんで。そうしているうちに、人生というものは、
わあわあ泣くのと、しくしく泣くのと、微笑みとで済まそうか、しかも、しく
しく泣くのが大部分を占めていると思うようになりました。

かなり認識ミスが多いですね。日本語部分はともかく、"60セント"が"2セント"になってしまうのは想定外でした。

日本語の手書き文字を認識させる

日本語だと活字でも上手く認識されないので、手書き文字だとなおさらダメだと予想が付きますが、一応試してみます。

こちらの画像を読み込ませます。

結果は以下の通り。

記憶切なの文字を選びてコピーする e

...確かに、私の"。"は小さな"e"に見えなくもないですね笑。

大変な悪筆という訳でもないと思うので、日本語の認識が難しいということなのでしょう。

まとめ

今回は、GPT-4Vのモデル(gpt-4-vision-preview)を使ってOCRを試してみました。

結論としては、英語であれば手書き・活字ともにかなりの精度でOCRできますが、日本語はまだまだ難しそうでした。

活字 手書き
英語
日本語 ×

クラウドベンダーが出している他のAIモデルなど、選択肢は豊富にあるので適材適所でやっていくのがよさそうですね。

それでは。

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