YaCy improved-search

실험적인 YaCy 포크: 더 나은 순위, 서명된 결과, NAT 뒤의 피어

YaCy의 포크입니다. 공개 네트워크에서 측정한 약점을 고치고, 위조된 결과와 스팸 결과를 걸러낼 수 있도록 신뢰 계층을 추가했으며, NAT 뒤의 피어도 릴레이를 통해 참여할 수 있게 했습니다. 이 페이지의 모든 주장은 누구나 docker compose로 다시 구성할 수 있는 폐쇄형 P2P 네트워크에서 측정한 것입니다.

상태: 실험. 이것은 YaCy 프로젝트의 릴리스가 아니며, YaCy 프로젝트와 관련이 없습니다. 공개 YaCy 네트워크와의 호환성을 의도적으로 깨뜨립니다(피어 ID, seed, CJK 단어 해시). 변경 사항이 무엇을 하는지 데이터로 보여 주고, 아이디어를 논의하며, 적합한 부분은 작은 단위로 업스트림에 제안하기 위해 공개합니다.

왜

공개 YaCy 네트워크(freeworld)에서 16개 쿼리로 측정한 결과, 상위 10개 결과 중 모든 검색어를 포함한 것은 11%에 불과했습니다. 원인을 살펴보면:

변경된 점

순위

더 엄격한 최소 일치, 피어별 정규화 이후의 검색어 포함률 가중치, 내용이 빈약한 페이지에 대한 감점 가중치, 그리고 작은 네트워크에서 모든 피어 검색.

CJK

중국어, 일본어, 한국어 텍스트를 Solr와 단어 인덱스 모두에서 겹치는 바이그램(bigram)으로 인덱싱하고 검색합니다.

신뢰

Ed25519 피어 키, 서명된 seed, 선언된 태그가 포함된 코디네이터 서명 신뢰 목록, 그리고 피어가 크롤링하는 모든 문서에 대한 작성자 서명.

NAT 통과

작은 go-libp2p sidecar(보조 프로세스)가 circuit relay에 슬롯을 예약하여, NAT 뒤의 피어가 검색에 응답할 수 있게 합니다.

검색 품질

증상원인변경
한 단어만 일치하는 페이지(키워드 스터핑)가 최상위에 오름여러 단어 쿼리에 Solr mm=1 사용최소 일치 2<-1 5<80%: 두 단어는 모두 일치해야 하고, 3–5단어는 하나가 빠져도 됨(search.ranking.solr.mm, .mm.cjk)
한 피어의 최고 부분 일치가 다른 피어의 완전 일치와 비슷한 순위를 받음피어별 점수 정규화정규화된 점수에 (찾은 단어 수 / 쿼리 단어 수)²를 곱하되, 최소 0.05이며 최소 일치가 보장하는 값보다 낮아지지 않게 함(search.ranking.coverage.exponent)
단어 인덱스에서 일본어 / 중국어를 찾을 수 없음CJK에 대한 단어 분할 없음단어 인덱스와 쿼리에서 겹치는 바이그램 사용; Solr 스키마에 CJKWidthFilter + CJKBigramFilter
제목에 쿼리 전체가 들어 있는 빈약한 페이지(태그 목록)가 최상위에 오름기본 qf가 title^5, h1^5(그리고 host ^6, URL 파일 이름 ^4, 경로 ^3)에 text^1보다 큰 가중치를 줌100단어 미만의 결과에 단어 수 / 100(최소 0.1)의 가중치를 적용(search.ranking.thin.words); CJK 단어 수 계산 수정(공백을 세고 있었음)
새 피어로 이루어진 네트워크가 다른 피어의 단어 인덱스를 전혀 검색하지 않음DHT 검색에는 3일보다 오래된 피어가 필요함설정 가능(remotesearch.dht.minage, 기본값 3)
작은 네트워크가 원격 Solr 쿼리를 아무에게도 보내지 않거나 DHT 대상을 건너뜀대상 수 공식이 0을 반환; DHT 대상이 Solr에서 제외되어 있었음피어가 32개 이하인 네트워크는 연결된 모든 신뢰 피어(개방 모드에서는 모든 피어)에 질의하며, DHT 대상도 포함함

신뢰 계층

NAT 통과

sidecar 프로세스(Go, go-libp2p)가 같은 키로 YaCy 옆에서 실행됩니다. NAT 뒤에 있을 때는 circuit relay v2에 슬롯을 예약하고, 서명된 seed에 circuit 주소를 알립니다(Reach=relay). 다른 피어는 그 피어로 가는 로컬 터널 포트를 열고 일반 HTTP를 사용하므로, YaCy의 기존 클라이언트가 변경 없이 동작합니다. 기본적으로 이런 피어는 검색에만 응답합니다. 직접 선택(opt in)하지 않는 한 DHT 데이터를 저장하지 않습니다.

자세한 내용은 신뢰 및 NAT 설계 (영어)를 참조하세요.

결과

yacy-lab의 두 가지 실험입니다. 둘 다 결정적인(deterministic) 코퍼스와 쿼리 세트로 docker compose에서 폐쇄형 네트워크를 실행합니다.

검색 품질: 업스트림 대 포크, 각 3개 피어

각 피어는 하나의 사이트를 크롤링합니다. 쿼리는 resource=global로 피어 1에 보내며, 관련 페이지 대부분은 다른 피어에 있습니다. 코퍼스에는 두 종류의 미끼가 있습니다. 한 검색어로 채워진 페이지와, 제목에 쿼리 전체가 들어 있는 빈약한 "태그 아카이브" 페이지입니다. 11개 쿼리(영어 6, 일본어 4, 중국어 1)의 평균이며, 2회 실행했고 별도 표시한 곳을 제외하면 결과가 같았습니다.

클러스터 / 경로R-precision ↑Recall@10 ↑상위 R개 중 미끼 ↓상위 10개에 모든 단어 포함 ↑
업스트림, 기본0.520.960.480.42
포크, 기본0.79–0.861.000.14–0.210.75
업스트림, 단어 인덱스만0.020.020.000.09
포크, 단어 인덱스만0.930.950.070.77

신뢰와 NAT: 포크 피어 6개, 릴레이 1개, NAT 1개

신뢰 피어 3개, ads를 선언한 신뢰 피어 1개, 서명은 되었지만 신뢰되지 않고 스팸을 크롤링하며 빌린 서명으로 문서를 심는 피어 1개, 그리고 MASQUERADE 라우터 뒤의 피어 1개입니다. 26개 검사가 모두 통과했으며, 그중 일부는 다음과 같습니다.

직접 해 보기

Docker 없이: 브라우저에서 데모 열기. 실제 데모에서 기록한 응답을 재생하는 모의 모드로 동작합니다(페이지는 일본어).

데모는 한 대의 머신에서 두 네트워크(업스트림 피어 3개, 그리고 포크의 신뢰 및 NAT 구성)를 시작하고 그 앞에 검색 페이지를 둡니다. 약 7 GB의 메모리를 쓸 수 있는 Docker가 필요합니다.

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분 걸리며 진행 상황이 표시됩니다)
데모 페이지: 같은 쿼리를 업스트림 네트워크(왼쪽)와 포크(오른쪽)에 보낸 모습. 업스트림은 스팸 페이지를 먼저 나열하고, 포크는 검증된 관련 페이지를 먼저 나열하며 개방 모드에서는 스팸을 그 아래에 unverified로 표시합니다.
개방 모드에서의 "bitcoin lightning channel". 왼쪽: 업스트림은 스팸을 먼저 보여 줍니다. 오른쪽: 포크는 검증된 결과를 먼저 보여 주고, unverified로 표시된 스팸은 그 아래에 보여 줍니다.

이 페이지에서는 신뢰를 바꿔 볼 수도 있습니다. 검색하는 피어가 어느 코디네이터를 신뢰할지 선택하고(두 번째 코디네이터는 스팸 피어만 나열하므로, 이를 신뢰하면 스팸이 "verified"가 됩니다), 신뢰 목록을 편집하고 다시 서명하고, 새 버전을 한 피어에 넘겨 퍼지는 모습을 지켜보고, 운영자의 위임을 철회하거나 복원할 수 있습니다.

실험 자체: 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). lab README를 참조하세요.

참여하기: 허가가 필요 없습니다

사람이든 에이전트든 누구나 피어를 실행하고, 한 멤버의 URL로 연결하고(p2p.bootstrap.peers, Tailscale 네트워크를 넘어서도 가능), 자신의 페이지와 서비스를 인덱싱하고 서명하며, 자신만의 코디네이터나 운영자를 운영할 수 있습니다. 코디네이터는 키 하나와 임의의 URL에 둔 서명된 파일 하나일 뿐이며, 서버가 필요 없습니다. 선언된 광고(ads 태그)는 허용됩니다. 누구의 목록을 신뢰할지는 사용자가 선택합니다. 참여 방법 · pull request 환영합니다.

AI 에이전트를 위해

에이전트는 검색 API나 API 키 없이 자신만의 피어를 실행하여 검색 도구로 사용할 수 있습니다.

한계