Ahogrammer

Deep Dive Into NLP, ML and Cloud

自然言語処理

ナレッジグラフを用いたRAGの改善

RAG(Retrieval Augmented Generation)は大規模言語モデル(LLM)の性能を改善するための手法の1つであり、質問に対する回答を生成する際に、外部知識源から情報を取り込みます。 これにより、LLM 自体で学習できる情報量に制限されることなく、より正確で…

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つ以上の異なる検索技術を組み合わ…

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

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日に発売のようです。表紙の鳥はオオハナインコで、オセアニアあたりに生息しています。 最近は…

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

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

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

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

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

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

Googleが開発した多言語の埋め込みモデル「LaBSE」を使って多言語のテキスト分類

自然言語処理において、テキストをその意味を考慮しつつ固定長のベクトルに変換する埋め込みモデルは重要です。文の意味をよく表現したベクトルを作ることができれば、テキスト分類や情報検索、文類似度など、さまざまなタスクで役立ちます。本記事では、Goo…

AWS LambdaにGiNZAを載せて、固有表現認識APIを作成する

一週間ほど前、AWS LambdaにElastic File System(EFS)をマウントできる機能が追加されました。この機能を使うことで、マウントしたEFS上への読み書きがLambda関数からできるようになりました。これまではLambdaの制限により、/tmpで使用可能な容量が512MB…

BERTで日本語の含意関係認識をする

含意関係認識(Recognizing Textual Entailment: RTE)とは、2つの文1と文2が与えられたときに、文1が正しいとしたら文2も正しいか否かを判定するタスクのことです。たとえば、文1として「太郎は人間だ。」という文があるとします。この文が正しいとしたとき…

教師あり学習を使ってオープンドメインのテキストから情報抽出する手法

オープンドメインの情報抽出は、この10年ほどで盛んになってきた自然言語処理の一分野でOpenIE(Open Information Extraction)と呼ばれている。OpenIEでは、ドメインを限定しないテキストからタプルを抽出する。たとえば、「ホンダは本田宗一郎によって創業…