YaCy improved-search English

YaCy の実験的なフォーク: 順位付けの改善・署名付きの結果・NAT の内側のピア

YaCy のフォーク。公開網で測って見つけた弱点を直し、偽の結果やスパムを除ける信頼の仕組みを足し、NAT の内側のピアもリレー経由で参加できるようにした。このページの主張はすべて、docker compose で誰でも組み直せる閉じた P2P 網で測ったもの。

位置づけ: 実験。YaCy プロジェクトのリリースではなく、YaCy プロジェクトとは関係がない。公開の YaCy 網との互換性(ピア ID、seed、日本語・中国語の単語 hash)は意図して捨てている。変更の効果をデータ付きで示して議論の材料にし、合うものは小さな単位で本家に提案するために公開している。

なぜ

公開の YaCy 網(freeworld)で 16 クエリを測ったところ、上位 10 件のうちクエリの全語を含む結果は 11% だった。原因を調べると:

何を変えたか

順位付け

厳しめの minimum match、ピアごとの正規化の後に掛ける語の被覆率の重み、本文の薄い頁の減点、小さな網での全ピアへの問い合わせ。

日本語・中国語

CJK の文字列を重なりのある 2 文字(bigram)として、Solr でも単語索引でも索引・検索する。

信頼

Ed25519 のピアの鍵、署名付きの seed、宣言タグ付きでコーディネータが署名する信頼の一覧、全文書への作者の署名。

NAT 越え

go-libp2p の小さな sidecar が circuit relay に予約を取り、NAT の内側のピアも検索に応答できる。

検索品質

症状原因変更
1 語だけ一致する頁(キーワードの詰め込み)が上位に来る2 語以上のクエリに Solr の mm=1minimum match 2<-1 5<80%: 2 語は両方必須、3〜5 語は 1 語の欠けを許す(search.ranking.solr.mm, .mm.cjk)
あるピアの部分一致の 1 位が、他ピアの完全一致と同じ順位になるピアごとの点数の正規化正規化後の点数に(見つかった語 / クエリの語)² を掛ける(search.ranking.coverage.exponent)
日本語・中国語が単語索引で引けないCJK の分かち書きが無い単語索引とクエリで重なりのある bigram に分ける。Solr の schema に CJKWidthFilter + CJKBigramFilter
クエリ全体をタイトルに持つ本文の薄い頁(タグ一覧)が上位に来るqf が title^15・h1^11 に対して本文 ^1本文が 100 語未満の結果に 語数 / 100 の重みを掛ける(search.ranking.thin.words)。CJK の語数の数え方を修正(空白の数を数えていた)
新しいピアだけの網で、他ピアの単語索引を検索しないDHT 検索は 3 日以上のピアだけ設定可能に(remotesearch.dht.minage、既定 3)
小さな網で remote Solr 検索がどこにも飛ばない、DHT 検索先を外す送り先数の式が 0 になる。DHT 検索先は Solr の問い合わせ先から外していた32 ピア以下の網では、DHT 検索先も含めて接続中の全ピアに問い合わせる

信頼の仕組み

NAT 越え

YaCy の横で同じ鍵を使う sidecar(Go、go-libp2p)を動かす。NAT の内側では circuit relay v2 に予約を取り、回線のアドレスを署名付きの seed で知らせる(Reach=relay)。他のピアはそのピアへのローカルのトンネルのポートを開いて普通の HTTP を使うので、YaCy の既存のクライアントはそのまま動く。このピアは既定では検索に応答するだけで、本人が申し出ない限り DHT のデータを預からない。

詳しくは信頼と NAT 越えの設計。

結果

yacy-lab の 2 つの実験。どちらも docker compose の閉じた網で、コーパスとクエリは決定的に作る。

検索品質: 本家とフォーク、各 3 ピア

各ピアは 1 サイトずつ crawl する。クエリは 1 番ピアに resource=global で投げ、正解の大半は他のピアにある。罠頁は 2 種類ある。クエリの 1 語を詰め込んだ頁と、クエリ全体をタイトルに持つ中身の薄い「タグ一覧」頁。11 クエリ(英語 6・日本語 4・中国語 1)の平均。2 回測り、範囲を示したもの以外は同じ値。

クラスタ / 経路R-precision ↑recall@10 ↑上位 R 件の罠 ↓上位 10 件で全語を含む ↑
本家、既定0.520.960.480.42
フォーク、既定0.84–0.881.000.12–0.160.75
本家、単語索引のみ0.020.020.000.09
フォーク、単語索引のみ0.930.950.070.77

信頼と NAT 越え: フォーク 6 ピア、リレー、NAT

信頼集合のピア 3 台、ads を宣言した信頼集合のピア、スパムを crawl して署名を流用した文書を仕込む「署名はあるが信頼集合外」のピア、MASQUERADE するルーターの内側のピア。26 の検査がすべて通る。主なもの:

動かしてみる

デモは 1 台のマシンで両方の網(本家 3 ピアと、フォークの信頼と NAT 越えの構成)を立て、その前に検索画面を置く。Docker とメモリ 7GB ほどが要る。

git clone https://github.com/pad01g/yacy_search_server.git yacy
git clone https://github.com/pad01g/yacy-lab.git
cd yacy
git checkout baseline        && docker build -t yacy-lab/upstream:baseline -f docker/Dockerfile .
git checkout improved-search && docker build -t yacy-lab/fork:latest -f docker/Dockerfile .
docker build -t yacy-lab/sidecar:latest sidecar/
cd ../yacy-lab
docker compose -f compose.demo.yaml -p yacydemo up -d
# http://localhost:8800 を開く(準備に 10 分ほどかかり、進み具合も画面に出る)
デモの画面。同じクエリを本家の網(左)とフォーク(右)に投げたところ。本家はスパム頁を先に並べ、フォークは検証済みの正解頁を先に並べ、開放モードではスパムを未検証の印付きでその下に並べる。
開放モードで「bitcoin lightning channel」。左の本家はスパムを先に出す。右のフォークは検証済みの結果を先に、スパムは未検証の印付きで下に出す。

画面では信頼の設定も変えられる。問い合わせ元が信頼するコーディネータを選ぶ(もう 1 つのコーディネータの一覧はスパムのピアだけで、それも信頼するとスパムが「検証済み」になる)。信頼の一覧を編集して署名し直す。新しい版を 1 つのピアにだけ渡して広がるのを見る。オペレータへの委任を失効させる、し直す。

実験そのもの: docker compose -p yacylab up -d && docker compose -p yacylab run --rm runner(検索品質)、docker compose -f compose.trust.yaml -p yacytrust up -d && docker compose -f compose.trust.yaml -p yacytrust run --rm runner(信頼と NAT 越え)。詳しくは yacy-lab の README。

AI エージェント向け

エージェントは自分のピアを動かし、検索 API も API キーも無しに検索の道具として使える。

限界