Ahogrammer

Deep Dive Into NLP, ML and Cloud

Azure AI Searchを使った同義語によるクエリ拡張とその効果

PythonからAzure AI Searchのシノニムマップを作成し、クエリ拡張をして、その効果を日本語の質問応答データセットで確認してみました。昔からある機能で、とくに何か新しいことをしているわけでもないのですが、使いそうな機会があったので試してみました。…

Chain-of-Tableを使った表データに対する推論

RAGを作っていると、論文に出てくる表データを読み取って回答してもらう等、表データを扱いたくなってくる場面が出てきます。そんな欲求を頭の片隅に置いておいたところ、Chain-of-Tableと呼ばれるプロンプトの手法を見かけたので試してみました。 本記事の…

意味的知識グラフとApache Solrを使った関連語検索の実装

Manningから出版予定の『AI-Powered Search』(AIを活用した情報検索の意)を冬休み中に読んでいたら、その中で意味的知識グラフ(Semantic Knowledge Graph)と呼ばれるデータ構造について説明していて、関連語の計算やクエリ拡張などに使えるということで…

日本語版のColBERTを検索に使ってみる

冬休み中に日本語版のColBERTであるJaColBERTが公開されていたので試してみました。ColBERTは、論文を読んでいるときに名前が出てくることがあるので試してみたかったのですが、これで試せるようになりました。

多言語E5をファインチューニングして検索性能を向上させる

多言語のテキスト埋め込み用のモデルであるMultilingual-E5[1]をファインチューニングして、検索性能が向上するか否かを日本語のデータセット検証してみました。結果としては、ファインチューニングすることで、OpenAIのtext-embedding-ada-002を上回る性能…

ハイブリッド検索で必ずしも検索性能が上がるわけではない

最近では、RAG(Retrieval Augmented Generation)を使って、検索して得られた文書を生成時に活用することがありますが、その性能を改善するための手法の1つとしてハイブリッド検索が知られています。ハイブリッド検索は、2つ以上の異なる検索技術を組み合わ…

ウォータールー大学による基盤モデルに関する読書リスト

今週号のData Science Weeklyにて、ウォータールー大学が開講している基盤モデルに関する講座が載っていたので紹介します。同講座では、トピックごとに整理された論文のリストが公開されているので、関心のあるトピックについて読み進めるのに適しています。…

検索性能を改善するハイブリッド検索で使えるランク融合アルゴリズム

Risk-Reward Trade-offs in Rank Fusionを読んでいて、検索システムの結果を統合するために使える教師なしのランク融合アルゴリズムについて書きたくなったのでまとめました。最近では、RAGの性能を改善するためにハイブリッド検索が使われることがあります…

LLMを用いたクエリ書き換えによる検索性能の変化を検証する

Rewrite-Retrieve-Readの論文[1]の構成で検索性能が改善するか試してみました。内容としては、RAGの内部で検索するときに、ユーザーのクエリを書き換えると性能が上がるという話です。ユーザーのクエリが検索に適しているとは限らないため、LLMで書き換えて…

LLMを用いたマルチクエリ生成による検索性能の改善

近年、大規模言語モデル(LLM)の進化は、自然言語処理の分野において画期的な変化をもたらしています。とくに、OpenAIのGPT-4のようなLLMは、その応用範囲の広さと精度の高さで注目を集めており、多くの研究者や開発者が新たな利用方法を模索しています。本…

LangChainを使ってHyDEによるクエリ変換の効果を検証する

ChatGPTやGPT-4をはじめとする大規模言語モデルの能力が向上し、多くの注目を集めています。とくにRAG(Retrieval Augmented Generation)と呼ばれる手法を使って、手元のデータを生成時に活用する手法がよく使われていますが、その性能を改善する方法は様々…

LangChain Templatesを使ってRAGを秒速で作る

本記事では、LangChain Templates[1]を利用し、RAGを簡単かつ迅速に構築する方法を紹介します。LangChainはLLMを使ったアプリケーションを実装するためのツールですが、LangChain Templatesを活用することで、煩雑なプロセスを大幅に簡略化できます。本記事…

文書検索におけるリランキングの効果を検証する

日本語でのキーワード検索とベクトル検索に対して、検索結果のリランキングを適用して性能を評価してみました。 リランキングとは? 文書検索では検索クエリにマッチングした文書を順位付けして返しますが、その結果を何らかのモデルを使って並び替えること…

Cohereの多言語用の埋め込みモデルを日本語で評価してみる

Cohereが提供を開始した多言語用のテキスト埋め込み用のモデルであるembed-multilingual-v3.0の性能を日本語の文類似度と検索のデータセットで評価してみました。 Cohere Embed v3とは CohereのEmbed v3はテキストを埋め込むためのモデルです[1]。これまでも…

ranxを使って検索システムのオフライン評価をする

ranxはPythonで実装されたランキング評価用のライブラリです。検索システムの評価に使える以下のような指標が用意されていたり、それらの結果をRRFのようなアルゴリズムで組み合わせたり、論文用にテーブルをエクスポートする機能を備えています。本記事では…

OpenAIの埋め込みよりも高性能?多言語E5を日本語で評価してみる

多言語のテキスト埋め込み用のモデルであるMultilingual-E5-largeの性能を日本語のデータセットで評価してみました。 E5とは E5とはEmbEddings from bidirEctional Encoder rEpresentationsの略で、テキストの埋め込み用のモデルです[1]。Web上から収集した…

生成したテキストをGPT-4で評価している論文

最近は、ChatGPTやGPT-4に関する記事が多数公開されています。とくに、自社の持つ文書に対して問い合わせをし、そこから回答を抽出したり、要約を生成するようなユースケースを見かけることが多い気がしています。こういったユースケースの場合、伝統的な評…

scikit-learnの学習済みモデルをONNX形式に変換して配布する

だいぶ昔の話ですが、日本語テキストをネガ/ポジ分類するソフトウェアとして、scikit-learnを用いて『asari』を作り、Pythonパッケージとして公開したことがあります。作った自分でも存在をほぼ忘れていたのですが、ときどき使うことを試みる方がいて、Issue…

部分的にアノテーションされたデータからの固有表現認識器の学習

本記事では、部分的にアノテーションされたデータを用いて、固有表現認識モデルの学習を試みます。

M1チップ上でのspaCyの高速化

導入されたのはだいぶ前ですが、spaCy v3.2からM1チップ上での学習と予測が最大で8倍高速化できるということで試してみました。以前は行列積の演算にBLISを使っていたところを、Appleのネイティブのライブラリに切り替えることで実現しています。その中核と…

『機械学習エンジニアのためのTransformers』が出ます

このたび、オライリー・ジャパンより、『Natural Language Processing with Transformers』の翻訳書である『機械学習エンジニアのためのTransformers』を出ることになりました。素直にタイトルを訳すと、『Transformersによる自然言語処理』のようになると思…

spaCyのSpanRulerを使ったルールベースの固有表現認識

一月ほど前の話になりますが、spaCy v3.3.1がリリースされました。いくつかの機能の追加とバグフィックスが行われているのですが、その1つとしてSpanRulerと呼ばれるコンポーネントが追加されています。このコンポーネントはルールベースで固有表現認識など…

オライリー・ジャパンから『実践 自然言語処理』という本を出します

このたび、オライリー・ジャパンより、『Practical Natural Language Processing』の翻訳書である『実践 自然言語処理』を出すことになりました。Amazonだと2月4日に発売のようです。表紙の鳥はオオハナインコで、オセアニアあたりに生息しています。 最近は…

fastTextの学習済みモデルのリンク

5年近く前から、fastTextの学習済みモデルをGoogle Driveで公開しているのですが、どうやらGoogle Driveのセキュリティアップデートにより、ダウンロードできなくなっていたようです。 fastTextの学習済みモデルを公開しました 結果として何が起きたかと言う…

SageMaker Processingでカスタムイメージを使ってデータを加工する

SageMaker Processingは、データの前処理や後処理、特徴エンジニアリング、モデルの評価といった機械学習のワークロードをSageMaker上で実行するための機能です。SageMaker Processingを使うことで、これらの処理をするためのジョブをコンテナ上で実行するこ…

benchmark関数を使ってデータセットの処理時間の計測と改善に取り組む

TensorFlowには、tf.data.Dataset APIという入力のパイプラインを実現するための強力な機能があります。入力のパイプラインを最適化することで学習全体を高速化できるため、定量的に計測して改善する価値があります。そこで、本記事ではTensorFlow Datasets…

Wikipediaの前処理はもうやめて「Wiki-40B」を使う

最近の自然言語処理では、大規模なテキストから単語の分散表現や言語モデルを学習させて使っています。学習する際のテキストとしては、分量や利用しやすさの都合からWikipediaが選ばれることが多いですが、その前処理は意外と面倒で時間のかかる作業です。そ…

【TensorFlow】StringLookupの使い方

以下のTweetで紹介したTensorFlow Recommendersのコードを見ていたら、StringLookupクラスという見慣れぬクラスを使っていました。あまり紹介している記事を見たことがないので、Tipsとしてどのようなものか紹介します。 TensorFlowで推薦システムを構築する…

GiNZAで解析した依存構造を文節単位で可視化する

自然言語処理において、依存構造解析は多くのアプリケーションに役立つ重要な技術の1つでしょう。たとえば、テキストからさまざまな情報を抽出するシステムやアスペクトベースの評判解析、含意関係認識といった幅広いタスクで役立ちます。日本語で依存構造を…

Universal Sentence Encoderをチューニングして多言語のテキスト分類

「Googleが開発した多言語の埋め込みモデル「LaBSE」を使って多言語のテキスト分類」と題した記事を書いたところ、「Universal Sentence Encoder(以下、USE)と比べてどうなのか?」というコメントを見かけました。そこで、本記事では、多言語の埋め込み表…