« ThinkPad E440のWireless LAN CardをIntel Dual Band Wireless-AC 7260に換装してみた | トップページ | ベクトル検索でなくたっていいじゃない ‐ Solrの全文検索とGemini CLIを使ったなんちゃってRAG ‐ »

2025.08.11

Apache Solr + llama.cpp embedding を使ってベクトル検索してみる

お盆ですね。embedding modelがいろいろ出てきたこともあり、この夏はApache Solrを使ったベクトル検索に挑戦してみました。

過去にこんなことを試していて、日常使いで使ってきました。
ScrapBook及びSave Page WEで保存したWebページをApache Solrで検索できるようにしてみた(その1)
ScrapBook及びSave Page WEで保存したWebページをApache Solrで検索できるようにしてみた(その2)
Apache Solrを使って形態素解析とBigramを併用してテキスト検索してみる

Apache Solr 9はベクトル検索を実装しています。下のような書籍も出てきまして、大変参考になりました。
今日から始めるAI検索技術 Solrエンジニアのための最先端ガイド - さしみもち
今日から始めるSolrベクトル検索 - もちっとカフェ

SolrもLangChainとの連携等もできるようですが、Python環境への依存度を大きくしたくないこともあり、llama.cppとShell Script活用を中心に実装してみました。

埋め込みベクトル化にbge-m3とmultiligunal-e5-largeのGGUF版を利用しました。Mac起動時にautomator.appを自動起動してllama.cppのllama-serverを立ち上げておきます。


[Path to llama.cpp]/build/bin/llama-server -m [Path to llama.cpp/bge-m3-GGUF-models/bge-m3-Q4_K_M.gguf --port 8993 -c 1024 --embeddings >& /dev/null &
[Path to llama.cpp]/build/bin/llama-server -m [Path to llama.cpp]/multilingual-e5-large-GGUF-models/multilingual-e5-large-Q4_K_M.gguf --port 8994 -c 512 --embeddings >& /dev/null &

埋め込みベクトル化(embedding)のコード


embedding()
{
vurl="${vurl}"
prefix="${prefix}"
qsentence="{\"content\":\"${prefix}${sentence}\"}"
RES=$(curl -sS -X POST "${vurl}" --data "${qsentence}" |
sed 's/\[{\"index\"\:0,\"embedding\"\:\[//' |
sed 's/\]}\]//')
}

Solr vector searchのコード


arg="${additionalarg}${RES}"
 
cat <<HTTP_RESPONSE
Content-Type: application/json;charset=UTF-8
 
 
$(curl -sS -X POST "$url" --data-binary "$arg")
HTTP_RESPONSE
exit 0

vurlはllama.cppのllama-serverのポート付きURLを指定します。また、urlはSolrサーバのポート付きURLを指定します。additionalargは先の書籍の設定例を参照していただきたいですが、qq=[sentence]&fl=exists(query($qq)) id title score search&sort=exists(query($qq)) desc, score desc&rows=50&q={!knn f=[vectorフィールド名] topK=50}'の後にベクトルを連結した形で指定します。

今回使用したbge-m3とmultilingual-e5-largeの次元数は1024ですので、引数がかなり長くなります。Solrの標準設定だと通りませんでしたので、設定ファイルの数値を変更する必要がありました。

従前のテキスト検索、ベクトル検索、Google Custom Search(外部検索)を選択して検索を実行できるようにしました。Apache SolrはjettyというJava Servletコンテナ/Webサーバを利用しているのですが、ベクトル次元が大きくなって引数が大きくなると要求が通らなくなりますので、設定値を拡大する必要があります。
solr/server/etcにあるjetty.xmlにおける


<Set name="outputAggregationSize"><Property name="solr.jetty.output.aggregation.size" default="8192" /></Set>
<Set name="requestHeaderSize"><Property name="solr.jetty.request.header.size" default="8192" /></Set>
<Set name="responseHeaderSize"><Property name="solr.jetty.response.header.size" default="8192" /></Set>

の"8192"を"163840"に変更しました。

2025081101
形態素解析とバイグラムの混合型

2025081102
CJK Bigram

2025081103
bge-m3とmultiligual-e5-largeを並列利用したベクトル検索(単にスコアの高い方を優先して採用しただけ)

2025081104
bge-m3を単独利用したベクトル検索

2025081105
multilingual-e5-largeを単独利用したベクトル検索

2025081106
Google Custom Searchを利用(外部サーチ)

ベクトル検索の精度ですが、体感では正直かなり微妙です。マルチモーダル検索の方が効果を実感できるのかも。今回実装した用途だと検索対象(ワード)がはっきりしていることが普通なので、むしろ既存の全文検索技術の完成度の高さが実感できた感じです。

|

« ThinkPad E440のWireless LAN CardをIntel Dual Band Wireless-AC 7260に換装してみた | トップページ | ベクトル検索でなくたっていいじゃない ‐ Solrの全文検索とGemini CLIを使ったなんちゃってRAG ‐ »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« ThinkPad E440のWireless LAN CardをIntel Dual Band Wireless-AC 7260に換装してみた | トップページ | ベクトル検索でなくたっていいじゃない ‐ Solrの全文検索とGemini CLIを使ったなんちゃってRAG ‐ »