デモアプリの動画

Elasticsearchの近似近傍探索を使って、ドラえもんのひみつ道具検索エンジンを作ってみた

Elasticsearch 8 系から使用可能になった近似近傍探索1を使って、ドラえもんのひみつ道具の自然言語検索ができる検索エンジンを作ってみた。 デモ動画のように、検索したいひみつ道具を説明する文章することで近しいひみつ道具が検索されます。 コードは GitHub に公開してあるので、興味のある方は手元で、動かして遊ぶことが出来ます。 poetry と Docker さえあれば動くようになっています。 hurutoriya/doraemon-himitsu-dogu-search: Doraemon Himitsu Dogu Japanese semantic search based on Elascticsearch ANN システムの概要図はこんな感じ 所感 ドラえもんのひみつ道具のデータセットを今回1から作ったが、パースと前処理がめんどくさくてここが一番手間がかかった。が、工夫しないと出来なかったので、一番楽しいところでもあった。 文章の特徴抽出は、sonoisa/sentence-bert-base-ja-mean-tokens-v2 · Hugging Faceを使わせていただき、驚くほど簡単に実現できた。 実際はもっと精度を高めるには、fine tune などがいいのだろうが、システム側を作ることに注力したかったので今回は割愛 デモアプリの構築は streamlit を使って 20m くらいで作れたので、相変わらず便利すぎて愛用している。今回の検索エンジンは CLI から実行もできるが、こうやってデモアプリがあったほうがそれっぽくて気持ちいい。 インデキシング時にトーカナイザーのことなど全く考えずに特徴ベクトルだけインデキシングして、それで検索が成り立つというのは新鮮。閾値設定しなければゼロヒット問題にも直面しないので、できることの幅は広がりそう。 Elasticsearch の近似近傍探索は、今回ベクトル同士の近似近傍探索しかやっていないが、それもインデキシング、クエリ部分は公式ドキュメントを見れば事足りたので変にハマることはなかった。 クエリ部分はこれだけで書けた。 1 2 3 4 5 6 7 8 9 10 query = { "knn": { "field": "vector", "query_vector": sentence_embeddings[0], "k": 10, "num_candidates": 100, }, "fields": ["name", "description"], } result = es....

October 23, 2022 · Shunya Ueta

Python で zip関数を使う際に、2つの配列が同じ大きさを想定する場合は 3.10 から導入された strict=True を使おう

Python で2つの配列を for 文で扱いたい場合によく使うのが zip() です。 zip()を使った for 文では暗黙的に同じ大きさが要求されると思っていたが、実際には以下のように2つの配列の大きさが異なっていてもエラーが出ないことに気が付かず、困ったことがあった。 1 2 3 4 5 6 7 8 9 10 In [1]: a = [1,2,3,4] In [2]: b = [1,2,3] In [3]: for i,j in zip(a,b): ...: print(i,j) ...: 1 1 2 2 3 3 てっきり、大きい配列の要素を参照時にエラーが発生するかと思ったら、そんなことはなかった。 assert とかで事前にコケるようにしておくとか必要そう。 もしくは、両者の配列のサイズが同じことを明示的に確認するのが吉。 また蛇足だが、Stackoverflow では意図的に異なる大きさの配列を上手く循環させつつ回したい場合の対処法も書いてあり勉強になった。1 2022-10-27: 追記 @ftnext さんから以下の情報2を教えてもらいました。 小さい方を読み切ったら for を抜けるの予想と違いますよね。 3.10 から zip に strict 引数が追加されており、True を指定すれば長さが異なると ValueError を送出するようになったんです! https://docs....

October 17, 2022 · Shunya Ueta

Apache Beam 2.40 で導入された scikit-lean, Pytorch の効率的な推論が可能になる RunInference API を試してみる

2022-07-21 に Google Cloud が Cloud DataFlow の新機能として、DataFlow ML という新機能を発表した。1 Dataflow ML - Speaking of ML transforms, Dataflow now has added out of the box support for running PyTorch and scikit-learn models directly within the pipeline. The new RunInference transform enables simplicity by allowing models to be used in production pipelines with very little code. These features are in addition to Dataflow’s existing ML capabilities such as GPU support and the pre and post processing system for ML training, either directly or via frameworks such as Tensorflow Extended (TFX)....

August 18, 2022 · Shunya Ueta
poetry show の実行結果

poetry show でパッケージ名に (!) が付与されている意味

poetry show は、poetry の設定ファイルの pyproject.tomlに記載された利用可能なパッケージ名を表示してくれる。 例えば、ターミナルで poetry install を行う前に、poetry showを行うと以下のような結果がでる。 そして、grep で上記の結果を表示させてみると 1 2 > poetry show | grep aiohttp aiohttp (!) 3.8.1 Async http client/server framework (asyncio) と パッケージ名に (!)が付与されている。 この(!)ってそもそもどんな意味なのか気になったので調べてみました。 Poetry のコードを直接読んでみると、 test_show_basic_with_not_installed_packages_non_decoratedのテストケースが今回の事例にマッチしており、わかりやすかった。 意味としては、「インストールされたパッケージに対する show コマンドを非装飾モードで結果を出力」へのテストだ。 状況としては、cachyとpendulumを poetry add して、 cachyのみを poetry install している。 1 2 3 4 5 6 7 8 9 10 poetry.package.add_dependency(Factory.create_dependency("cachy", "^0.1.0")) poetry.package.add_dependency(Factory.create_dependency("pendulum", "^2.0.0")) cachy_010 = get_package("cachy", "0.1.0") cachy_010.description = "Cachy package" pendulum_200 = get_package("pendulum", "2....

August 10, 2022 · Shunya Ueta

社内でデータ分析結果を可視化・共有する際に Google Colab が便利

社内でデータ分析のレポートを書く際は Google Colab がとても便利な事に気がついた。 Google Bigquery でデータを抽出、Google Sheets で可視化 従来だと、自分がやっていた方法として、 Google BQ などで分析対象結果のデータを抽出 その結果を Google Spread Sheet として保存して、Google Sheets の機能で可視化。元の SQL のコードは、別シートを作ってそこに貼り付けておく。 利点としては、一度データを抽出した後は、Google Sheets で二次加工が簡単にできる点がとても便利。 また、 Google Sheet を共有後に Produc Manager が出したい数値を、Product Manager 自身が Google Sheets を元にさっと計算することもできる。 だが、二次加工が便利なのはいいが、大抵の可視化ってパターンが決まっているかつ二次加工の状況が必ず発生するわけではないので、SQL 取得とその可視化を一気通貫でできないかなと考えていた。 なにか良い方法無いかなと思っている矢先に、別のチームの同僚が、Google Colab を使って、BQ を dataframe として保存後 matplotlib で可視化しているのを見かけて、 求めていたのは…こ、これだ…. となり、速攻取り入れました。 良いと思ったところは積極的に真似する Google Colab なら、データの取得・加工・可視化までを完結可能 Google Colab の利点を列挙しておく SQL のコード、データ抽出や可視化のロジックなどが Python で記述可能かつ、Google Colab で完結 matplotlib で可視化できるので、見やすく美しい図を作れる そしてそのコードは他のデータ分析でも再利用可能 pandas dataframe で Google BQ からデータを取得するので、Standard SQL だけでは難しい計算も pandas、 numpy や scipy などを使ってデータ加工が簡単にできるのも、便利 Google Sheets 同様、簡単に社内で共有できる Markdown も Google Colab 内で書けるので、凝った文章などもいれてレポートも書ける マジックコマンドで、Google BQ の結果を dataframe として保存1したり、...

May 10, 2022 · Shunya Ueta