Solr9 ããå°å ¥ããããã¯ãã«æ€çŽ¢ã£ãŠã©ããªæãïŒ
å¿ãã人åãã®èŠç¹
- ãã¯ãã«ããŒã¿ããããã°å¿ èŠãª Solr å®çŸ©ã¯ãã£ã2è¡
- ã¯ãšãªã
q,fq,rqqã§äœ¿ããŠãæå®æ¹æ³ãã·ã³ãã« - 100äžä»¶çšåºŠã®ã€ã³ããã¯ã¹ã§ãã¬ã¹ãã³ã¹ã¿ã€ã ã¯æ°10ms~æ°100msãªã®ã§å²ãšäœ¿ããã
- Solr ã«ã¯ embedding æ©èœã¯ãªãã®ã§ãã€ã³ããã¯ã¹ããŒã¿ãã¯ãšãªã®ãã¯ãã«å€æã¯ã©ãã«ãé 匵ã£ãŠãã ãã

ã¯ããã«
Solr9 ãããå人çã«åæããŠãã DenseVectorField ãã£ãŒã«ãåãš Kè¿åæ³ïŒKNNïŒã¯ãšãªãŒããŒãµãŒã«ããå¯ãã¯ãã«ãã¥ãŒã©ã«æ€çŽ¢ã远å ãããŸããã
ãã¯ãã«æ€çŽ¢ã䜿ãã°ãé¡äŒŒç»åã®æ€çŽ¢ãã·ããã (é¡çŸ©èªèŸæž)ã䜿ããã«å矩èªãå«ãããã¥ã¡ã³ãã®æ€çŽ¢ãªã©åŸæ¥å šææ€çŽ¢ãšã³ãžã³ã§ã¯å°åºå®çŸã§ããªãã£ãæ€çŽ¢ãã§ããããã«ãªããŸãã
äŸãã°ä»¥äžã®ããã«ãã¯ãšãªããŒã¯ãŒããã®ãã®ãå«ãã§ããªããŠãã䌌ããããªå 容ã®ããã¥ã¡ã³ããããããããããããã«ãªããŸãã

ex. ããã¹ã to ããã¹ãæ€çŽ¢
ãã以å€ã«ããç»åããé¡äŒŒããç»åã®æ€çŽ¢ãããã¹ãããç»åã®æ€çŽ¢ãªã©ãã§ããããã«ãªã£ãããããŸãã

ex. ç»å to ç»åæ€çŽ¢

ex. ããã¹ã to ç»åæ€çŽ¢
究極çã«ã¯ãã¯ãã«æ
å ±ã«ãã倿ãããŠããã°ããã®ã§ãããã¹ãã ããããç»åã ããããé³å£°ãåç»ãªãã§ãæ¯èŒã§ããŸãã
æ€çŽ¢çµæã®è¯ãæªãã¯ããŸã Solr åŽã§ã¯é¢äžã®äœå°ã¯ãªããäºåã«ã©ãã ãè¯ããã¯ãã«å€æ(以äžãembedding)ã¢ãã«ãäœãããã«ããã£ãŠããŸãã
è¿å¹Žã¯ ChatGPT ã®ç»å Žã«ãã£ãŠæ€çŽ¢ã«ç Žå£çãªåœ±é¿ãåãŒããŠããŸããã瀟å
ã®ç¬èªããŒã¿ãå«ãèªç€Ÿã®ãµã€ãå
ã®æ€çŽ¢ãšã³ãžã³ãè¿ã
ã« ChatGPT ã«åã£ãŠä»£ãããããšããããšã¯ãŸã ãªãã§ãããã
ãã¯ãã«æ€çŽ¢ã¯èªç€ŸãµãŒãã¹ã®æ€çŽ¢äœéšãããè¯ãããããã®1ãã©ãŒæè¡ã«ãªãåŸããšæããŸãã
ãŸãã¯ãã¯ãã«æ€çŽ¢ã䜿ã£ãŠã¿ãããšããæ¹ã¯ã Google Cloud ããŒãããŒã§ãã Groovenauts ã«ãã£ãŠéçºããããã¢ãµã€ãããã³ãŠã£ããã® KandaSearch ã«ãããã¢ãµã€ããè§Šã£ãŠã¿ããšãã®åšåãäœæã§ãããšæããŸãã
ç¹ã« KandaSearch ã®ãã¢ãµã€ãã¯è£ã§ã¯ä»å玹ä»ãã Solr ã«ãããã¯ãã«æ€çŽ¢ã䜿ãããŠããŸãã[1]
ã€ã³ããã¯ã¹ç·š
Solr å®çŸ©
äœ¿ãæ¹ã¯æãã®ã»ãç°¡åã§ãã
å
¬åŒããã¥ã¡ã³ãã§ãã£ãããšãã¥ãŒããªã¢ã«ãããã®ã§ãããã«åŸãã°äœ¿ããŠããŸããŸãã
ãŸãã¯ãã¹ããŒãå®çŸ©ã«ãã¯ãã«æ€çŽ¢çšã®åãšãã£ãŒã«ããå®çŸ©ããŸãã
<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.6">
<field name="_version_" type="plong" indexed="false" stored="false" />
<field name="_root_" type="int" indexed="true" stored="false" docValues="false" />
<uniqueKey>id</uniqueKey>
<field name="id" type="int" indexed="true" stored="true" required="true" />
<field name="vector" type="knn_vector" indexed="true" stored="false" /> <!-- ãã£ãŒã«ãå®çŸ© -->
<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0" />
<fieldType name="plong" class="solr.LongPointField" docValues="true" />
<fieldType name="knn_vector" class="solr.DenseVectorField" vectorDimension="4" similarityFunction="cosine" /> <!-- åå®çŸ© -->
</schema>
vectorDimensionã¯ã€ã³ããã¯ã¹ãããã¯ãã«ã®æ¬¡å
æ°ã§ãã
çŸç¶æå®ã§ããã®ã¯æå€§1024次å
ãŸã§ã§ãã
similarityFunctionã«ã¯é¡äŒŒåºŠèšç®ã®æ¹æ³ãå®çŸ©ããŸããããã©ã«ãã¯ãŠãŒã¯ãªããè·é¢ã«ãªã£ãŠããŸãããå
¬åŒã®æšå¥šã¯ã³ãµã€ã³é¡äŒŒåºŠã§ãã
2023幎2æ25æ¥çŸåšã䜿çšã§ããèšç®ææ³ã¯ä»¥äžã®3ã€ã§ãã
-
euclidean: ãŠãŒã¯ãªããè·é¢(defaultã¯ãã) -
dot_product: å ç© -
cosine: ã³ãµã€ã³é¡äŒŒåºŠ
DenseVectorField 㯠indexed ãš stored ãæå®ã§ããŸããSolr9.1 æç¹ã§ã¯ multiValued ã¯ãµããŒããããŠããŸããã
ãªã®ã§ãè€æ°ã®ã¢ãã«ã§ embedding ãããã¯ãã«ãæããããšãã£ãããšã¯ã§ããŸããã
åºæ¬çã«ã¯ãããŸã§ãå®çŸ©ããŠããã°OKã§ãã
ããç·»å¯ã«ããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ãããããšãã¯ã现ãããã©ã¡ãŒã¿ãæå®ããŸãã
é«åºŠãªèšå®ãããããšãã¯ä»¥äžã®è¡ã solrconfig.xml ã«è¿œå ããŠãããŸãã
<config>
<codecFactory class="solr.SchemaCodecFactory"/>
...
ãã®äžã§ãã¹ããŒãå®çŸ©ã§ãã©ã¡ãŒã¿ãæå®ããŸãã
<fieldType name="knn_vector" class="solr.DenseVectorField" vectorDimension="4" similarityFunction="cosine" knnAlgorithm="hnsw" hnswMaxConnections="10" hnswBeamWidth="40"/>
<field name="vector" type="knn_vector" indexed="true" stored="true"/>
knnAlgorithm="hnsw" ã¯è¿äŒŒè¿åæ¢çŽ¢ã®ã¢ã«ãŽãªãºã ã§ãã
Elasticsearch/Solr ã®ã³ã¢ãšã³ãžã³ã§ãã Apache Lucene ã§æ¡çšãããŠããè¿äŒŒè¿åæ¢çŽ¢ã¢ã«ãŽãªãºã ã¯ãå·çæç¹ã§ã¯ãHierarchical Navigable Small World(HNSW) ã®ã¿ã§ãã
HNSW ã¯ã°ã©ãæ¢çŽ¢åã®ã¢ã«ãŽãªãºã ã§ãã¯ãã«è·é¢ã«å¿ããŠäºåã«ã°ã©ããæ§ç¯ããŠãããŸãã
æ¢çŽ¢ã¯é«éã ããäºåã«æ§ç¯ããã°ã©ãã®èªã¿èŸŒã¿ã«æéãããããšããç¹æ§ããããŸãã
ãŸããå§çž®ããã«çããŒã¿ããã®ãŸãŸã¡ã¢ãªäžã«å±éããŠåŠçãããã®ã§ãã¡ã¢ãªã®æ¶è²»éã倧ãããªããŸãã
2020幎㫠Google ã ScaNN ãšããããé«éã§é«ç²ŸåºŠã»é«å¹çãªã¢ã«ãŽãªãºã ãæå±ããŸãããã2018幎æç¹ã§ã¯ million-scale ã®ããã¥ã¡ã³ãã®è¿äŒŒè¿åæ¢çŽ¢ã§ã¯æ±ºå®çãšèšãããŠããã¢ã«ãŽãªãºã ã§ãã

ç»åã¯[Malkov+, Information Systems, 2013]ããåŒçš
HNSW 㯠Python 補ã®è¿äŒŒè¿åæ¢çŽ¢ã©ã€ãã©ãªã§ãã nmslib ã faiss ã«ãæ¡çšãããŠããŸãã
Solr äžã§ãã¥ãŒãã³ã°ã§ãããã©ã¡ãŒã¿ã¯ä»¥äžã®2ã€ã§ãã
ãããã HNSW ã§ãã£ãšãæ€çŽ¢çµæãžã®ã€ã³ãã¯ãã®å€§ãããã©ã¡ãŒã¿ãšèšãããŠããŸãã
-
hnswMaxConnections: 飿¥æå€§ããŒãæ°(default=16)- ããçšåºŠå€ã倧ãããããš recall ãåäžããŠæ€çŽ¢æéãççž®ããããã€ã³ãã¯ã¹äœææéã¯é·ããªã
- 劥åœãªãã©ã¡ãŒã¿ç¯å²ã¯5~100ãšèšãããŠãã
-
hnswBeamWidth: æ¢çŽ¢è¿åããŒãæ°(default=100)- å€ã倧ãããããšãrecall ã倧ãããªãæ€çŽ¢ç²ŸåºŠãåäžããããã€ã³ããã¯ã¹äœæã«æéã¯é·ããªã
- 劥åœãªãã©ã¡ãŒã¿ç¯å²ã¯100~2000ãšèšãããŠãã (nmslibã®ããã©ã«ã㯠200, faiss ã®ããã©ã«ã㯠40)
åºæ¬çã«å€ã倧ãããããšå šæ¢çŽ¢ã«è¿ã¥ãããã®åã€ã³ããã¯ã¹æéãã¡ã¢ãªäœ¿çšéãå¢ããããã§ãã
詳ããã¯ä»¥äžåç §ãã ããã
- HNSWã«ã€ããŠ
- https://www.sciencedirect.com/science/article/abs/pii/S0306437913001300 [2]
- https://arxiv.org/abs/1603.09320 [3]
- https://yusukematsui.me/project/survey_pq/doc/ann_billion_2018.pdf [4]
- https://suzuzusu.hatenablog.com/entry/2020/12/14/020000 [5]
- https://towardsdatascience.com/ivfpq-hnsw-for-billion-scale-similarity-search-89ff2f89d90e [6]
- ScaNNã«ã€ããŠ
ã€ã³ããã¯ã¹ããŒã¿ã®äœãæ¹
DenseVectorField åã§å®çŸ©ãããã£ãŒã«ãã«ãªã¹ã圢åŒã§ãã¯ãã«ãç»é²ããŸãã
ããã§ã®ãã¯ãã«ã®æ¬¡å
æ°ã¯ vectorDimension ã§æå®ãããµã€ãºã«åãããŠãããŸãã
[
{
"id": "1",
"vector": [1.0, 2.5, 3.7, 4.1]
},
{
"id": "2",
"vector": [1.5, 5.5, 6.7, 65.1]
},
{
"id": "3",
"vector": [3.0, 11.0, 13.4, 130.2]
},
{
"id": "4",
"vector": [1.0, 2.1, 3.0, 4.0]
}
]
Solr9 ããå®è³ª Data Import Handler (DIH) ã¯å»æ¢ã«ãªã£ãŠããŸã£ãã®ã§ãcurl ãªã©ã䜿ã£ãŠæå
¥ããŸãã
ã©ãããŠã DIH ã䜿ããããšããæ¹ã¯å æ¥ãããªèšäºãæžããŸããã®ã§åèã«ããŠã¿ãŠãã ããã
æ€çŽ¢ç·š
åºæ¬çãªäœ¿ãæ¹
æ€çŽ¢æãç°¡åã§ãã
ãã¯ãã«ãã€ã³ããã¯ã¹ããããã£ãŒã«ããæå®ããŠã€ã³ããã¯ã¹æãšåãããã«ãªã¹ã圢åŒã§ãã¯ãã«ãæž¡ããŠãããŸãã
http://localhost:8983/solr/mini/select?&q={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]&fl=id score
f ããã¯ãã«æ€çŽ¢å¯Ÿè±¡ãã£ãŒã«ãã§ãtopK ãäžäœäœä»¶ãååŸãããã®æå®ã«ãªããŸãã
topK ã®ããã©ã«ãã¯10ä»¶ã§ãã
äžèšã®äŸã ãš [1.0, 2.0, 3.0, 4.0] ã«è¿ãé ã«ã¹ã³ã¢ãé«ããªãæ€çŽ¢äžäœã«ãããããŸãã
ã¹ã³ã¢ã¯ similarityFunction ã§æå®ããé¡äŒŒåºŠèšç®ã®æ¹æ³ã䜿ã£ãŠç®åºãããå€ã«ãªããŸãã
"response": {
"numFound": 4,
"start": 0,
"maxScore": 0.9999288,
"numFoundExact": true,
"docs": [
{
"id": 4,
"score": 0.9999288
},
{
"id": 1,
"score": 0.99773216
},
{
"id": 2,
"score": 0.90716124
},
{
"id": 3,
"score": 0.90716124
}
]
}
ã¹ã³ã¢èšç®ã cosine ã«ããã®ã§ãid:2 ãšè§åºŠãåãã§ãã«ã ã2åã® id:3 ã®ããã¥ã¡ã³ãã¯é¡äŒŒåºŠãåãã«ãªã£ãŠããŸãã
ããŒã·ãã¯ãª q ãã©ã¡ãŒã¿ã ãã§ãªããã£ã«ã¿ãŒã¯ãšãª fq ã ãªã©ã³ãã³ã°ã¯ãšãª rqq ã«ã䜿ããŸãã
- ãã£ã«ã¿ãŒã¯ãšãªã«ãã¯ãã«æ€çŽ¢ã䜿çšãã
&q=id:(1 2 3)&fq={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]&fl=id score
- ãã£ã«ã¿ãŒã¯ãšãªãšäœµçšãã
&q={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]&fq=id:(1 2 3)&fl=id score
- ãªã©ã³ãã³ã°ã¯ãšãªã«ãã¯ãã«æ€çŽ¢ã䜿çšãã
&q=id:(3 4 9 2)&rq={!rerank reRankQuery=$rqq reRankDocs=4 reRankWeight=1}&rqq={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]&fl=id score
ãŸãã&q={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]&fq={!frange cache=false l=0.99}$q ã®ãã cache ã cost ãªã©ã®ããŒã«ã«ãã©ã¡ãŒã¿ã䜿ãã°ãé¡äŒŒåºŠã¹ã³ã¢ãçµãèŸŒã¿æ¡ä»¶ã«ããããšãã§ããŸãã
"response": {
"numFound": 2,
"start": 0,
"maxScore": 0.9999288,
"numFoundExact": true,
"docs": [
{
"id": 4,
"score": 0.9999288
},
{
"id": 1,
"score": 0.99773216
}
]
}
ãã£ã«ã¿ãŒã¯ãšãªã§ãã¯ãã«æ€çŽ¢ã䜿ãå Žåã®æ³šæç¹
ãã£ã«ã¿ãŒã¯ãšãªã§ãã¯ãã«æ€çŽ¢ã䜿çšããå Žåã¯ããã£ã«ã¿ãŒã¯ãšãªã§çµã蟌ãŸããããã§ q ãã©ã¡ãŒã¿ã«ããæ€çŽ¢ããªãããŸãã
ãŸããã¹ã³ã¢èšç®ã¯ q ã§æå®ããã»ãã§è¡ãããŸãã
q ã§äœ¿ãã¹ãã fq ã§äœ¿ãã¹ããã¯ããèããããã§æå®ããŸãããã
ex. ãã£ã«ã¿ãŒã¯ãšãªã§ãã¯ãã«æ€çŽ¢ã䜿çšããå Žå
http://localhost:8983/solr/mini/select?&q=id:(1 2 3)&fq={!knn f=vector topK=2}[1.0, 2.0, 3.0, 4.0]&fl=id score
"response": {
"numFound": 1,
"start": 0,
"maxScore": 0.54726034,
"numFoundExact": true,
"docs": [
{
"id": 1,
"score": 0.54726034
}
]
}
é¡äŒŒåºŠèšç®çµæäžäœ2ä»¶(id: 4, 1)ã«å¯ŸããŠã¡ã€ã³ã¯ãšãª q ã§çµã蟌ã¿ãè¡ãã
ex. ã¯ãšãªã§ãã¯ãã«æ€çŽ¢ã䜿çšããå Žå
http://localhost:8983/solr/mini/select?&fq=id:(1 2 3)&q={!knn f=vector topK=2}[1.0, 2.0, 3.0, 4.0]&fl=id score
"response": {
"numFound": 2,
"start": 0,
"maxScore": 0.99773216,
"numFoundExact": true,
"docs": [
{
"id": 1,
"score": 0.99773216
},
{
"id": 3,
"score": 0.90716124
}
]
}
id: 1,2,3 ã«çµã蟌ãã ããã§é¡äŒŒåºŠäžäœ2ä»¶ãããããããã(id: 2,3ã¯åå€ãªã®ã§ã©ã¡ããéžã°ãããã¯ã©ã³ãã ïŒ)
ãªã©ã³ãã³ã°ã¯ãšãªã§äœ¿ãå Žåã®æ³šæç¹
ãªã©ã³ãã³ã°ã¯ãšãªã§ãã¯ãã«æ€çŽ¢ã䜿çšãããšãã¯ãæçµçãªã¹ã³ã¢ã¯ã¡ã€ã³ã¯ãšãª q ãšé¡äŒŒåºŠã¹ã³ã¢(ã« reRankWeight ãæãããã®) ã®åç®ã§æ±ºãŸããŸãã
ex. ã¡ã€ã³ã¯ãšãªãidã«ãããšãã®ã¹ã³ã¢
http://localhost:8983/solr/mini/select?&q=id:(1 2 3 4)&fl=id score
"response": {
"numFound": 4,
"start": 0,
"maxScore": 0.54726034,
"numFoundExact": true,
"docs": [
{
"id": 1,
"score": 0.54726034
},
{
"id": 2,
"score": 0.54726034
},
{
"id": 3,
"score": 0.54726034
},
{
"id": 4,
"score": 0.54726034
}
]
}
ex. ã¡ã€ã³ã¯ãšãªããã¯ãã«æ€çŽ¢ã«ãããšãã®ã¹ã³ã¢(é¡äŒŒåºŠ)
http://localhost:8983/solr/mini/select?&q={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]&fl=id score
"response": {
"numFound": 4,
"start": 0,
"maxScore": 0.9999288,
"numFoundExact": true,
"docs": [
{
"id": 4,
"score": 0.9999288
},
{
"id": 1,
"score": 0.99773216
},
{
"id": 2,
"score": 0.90716124
},
{
"id": 3,
"score": 0.90716124
}
]
}
ex. ãªã©ã³ãã³ã°ã¹ã³ã¢(=idã§ã®ã¹ã³ã¢+é¡äŒŒåºŠã¹ã³ã¢)
http://localhost:8983/solr/mini/select?&q=id:(3 4 9 2)&rq={!rerank reRankQuery=$rqq reRankDocs=4 reRankWeight=1}&rqq={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]&fl=id score
"response": {
"numFound": 3,
"start": 0,
"maxScore": 0.54726034,
"numFoundExact": true,
"docs": [
{
"id": 4,
"score": 1.5471891
},
{
"id": 2,
"score": 1.4544215
},
{
"id": 3,
"score": 1.4544215
}
]
}
ãŸããé¡äŒŒåºŠã¹ã³ã¢ã¯ã¡ã€ã³ã¯ãšãªã§ã®äžäœNä»¶(reRankDocs ã§æå®ããæ°)ã®ããã¥ã¡ã³ãã«ã ããªãããŸãã
http://localhost:8983/solr/mini/select?&q=id:(3 4 9 2)&rq={!rerank reRankQuery=$rqq reRankDocs=1 reRankWeight=1}&rqq={!knn f=vector topK=10}[1.0, 2.0, 3.0, 4.0]&fl=id score
"response": {
"numFound": 3,
"start": 0,
"maxScore": 0.54726034,
"numFoundExact": true,
"docs": [
{
"id": 2,
"score": 1.4544215
},
{
"id": 3,
"score": 0.54726034
},
{
"id": 4,
"score": 0.54726034
}
]
}
äžèšã®äŸã ãš id:2 ã®ããã¥ã¡ã³ãã ãé¡äŒŒåºŠã¹ã³ã¢ãå ç®ãããŠããŸãã
詳ãã㯠ReRank Query Parser ãã芧ãã ããã
ã¬ã¹ãã³ã¹æ§èœ
äœ¿çšæ¹æ³ãããã£ããšããã§ãå®çšã«èããããèŠãŠã¿ãŸãã
ä»å䜿çšãããã·ã³ã¹ããã¯ã¯ä»¥äžã®éãã§ãã
| CPU | Memory | JVM-memory |
|---|---|---|
| 6Core | 6GB | 2GB |
:::note warn
1å°ã®ãã·ã³ã§ããã³ããšã³ãã API ã Solr ãåãããŠããã®ã§ããããã¯ãŒã¯éä¿¡ã«ããã©ã°ã¯å°ãªããšæããŸããããã®å CPU ã Memory ã¯å
±åãªã®ã§åããã«ãŠã§ã¢ããã«ã§ãªãœãŒã¹ã䜿ããŠããããã§ã¯ãããŸããã
:::
ã€ã³ããã¯ã¹ããŒã¿ã¯ãªãŒãã³ããŒã¿ãã17,000ä»¶ã»ã©åéã㊠embedding ããŸããã
èŠãŠã®éããæ€çŽ¢éåºŠã¯æ°åããªç§ã»ã©ã§çµæ§æ©ãã§ãã
æ€çŽ¢ã®éã«ã¯ãã¯ãã«ã®æ¬¡å
æ°ã«ããæ€çŽ¢é床ã«ã¯å€§ããªéãã¯ãªãããã§ãã

200次å
ã®å Žå

512次å
ã®å Žå
ã©ã¡ãããšãããšãã¯ãšãªã®ããã¹ããç»åã® embedding æéã®æ¹ãããã«ããã¯ã«ãªã£ãŠãããã§ãã[7]
ãã®ãããã¯è»œéãªã¢ãã«ã䜿ãããããã€ã¹ããã¯ãªãã·ã³ã GPU ã䜿ããªã© API åŽã®å·¥å€«æ¬¡ç¬¬ã§ãã
ãŸããé£ç¶ããŠåãã¯ãšãªãæãããšãããããã£ãã·ã¥ãå¹ããŠã¬ã¹ãã³ã¹ãæ©ããªããŸããã

1åç®

2åç®
å
ã»ã©ã®ããã¹ãã®äŸã ãš3,4åç®ã ãšã»ãŒ0ããªç§ã§ã¬ã¹ãã³ã¹ãåŸãããããã«ãªããŸããã

200次å
ã®å Žå

512次å
ã®å Žå
embedding + æ€çŽ¢ã®ããŒã¿ã«ã§æ°çŸããªç§ãªã®ã§ããµãŒãã¹èŠä»¶ããããŸã§ãã€ããªããµãŒãã¹ã§ããã°ååçµã¿èŸŒãããã§ãã
ãã ãå®éã« Solr éçšè
ã®æ¹ã ãšãæ°äžä»¶ãªãŒããŒã®ããã¥ã¡ã³ãã¯å°ãªããããšæããããããããŸããã
確ãã«ãSolr ããµãŒãã¹ã§å°å
¥ããŠããå Žåã¯ãå°ãªããšã100äžä»¶ãªãŒããŒä»¥äžã®ããã¥ã¡ã³ããã€ã³ããã¯ã¹ãããŠããã±ãŒã¹ãå€ããšæããŸãã
ããã§ã100äžä»¶ãªãŒããŒã«ãªã£ãŠããã®ã¬ã¹ãã³ã¹é床ãä¿ãŠãã®ãã«ã€ããŠã調ã¹ãŠã¿ãŸããã
ã€ã³ããã¯ã¹ããŒã¿ã«ã¯æ¥æ¬èª Wikipedia ããŒã¿ãæ±ãããããã CirrusSearch ã®ãã³ãããŒã¿ã䜿ããŸããã
å®éã®ããŒã¿ã¯ä»¥äžããååŸã§ããŸãã
ãããã120äžä»¶ã»ã©ããŒã¿ãéããŠããŠã€ã³ããã¯ã¹ãããŸãã[8]
ãã®ã€ã³ããã¯ã¹ã«å¯ŸããŠæäœæ¥ã§100ãã¿ãŒã³ã»ã©ã¯ãšãªãçšæããŠè² è·ããããŠã¿ãŸãã
è² è·è©ŠéšããŒã«ã«ã¯ Taurus ã䜿çšããŠããŸãã
| ããã¥ã¡ã³ãæ° | ãã¯ãã«ã®æ¬¡å æ° | Replicaæ° | Shardæ° | åæã¢ã¯ã»ã¹æ° | QPS |
|---|---|---|---|---|---|
| 1,200,000 | 200 | 1 | 2 | 5vu | 20QPS |

å¹³åã¬ã¹ãã³ã¹ã¿ã€ã ã¯65msãšããã¥ã¡ã³ãæ°ãå¢ããŠããã»ã©åœ±é¿ã¯ãªãããã§ãã
ãã£ããšåãæ§æã§ãããå°ãè² è·ãäžããŠã¿ãŸãã
| åæã¢ã¯ã»ã¹æ° | QPS |
|---|---|
| 5vu | 50QPS |

ãããšãåããã·ã³äžã§è² è·è©ŠéšããŒã«ãåãããŠããããšããã£ãŠãããããããã·ã³ã¹ããã¯çã«30QPSãéçã®ããã§ããã
è² è·ãå¢ããŠãã¬ã¹ãã³ã¹ã¿ã€ã ã3å匱ã»ã©ã«å¢ããŸããã
ããã»ã©ç»é¢ããèŠãåã«ããã£ãã·ã¥ãå¹ããŠãããšæ©ããã§ããã
ããã§ãã¯ãšãªãåºå®ããŠåæ¡ä»¶ã§è² è·ããããŠã¿ãŸãã

ãã¯ããã£ãã·ã¥ãå¹ããŠããã®ããã¡ãããš50QPSãåºãŠãããã¬ã¹ãã³ã¹ãããªãé«éã«ãªããŸããã
ãã ãå®éã«ã¯ããŒã¯ãŒãã¯ãšãªã«æ¯ã¹ãŠãåããã¯ãã«ã®ãªã¯ãšã¹ããé£ãã§ããããšã¯çšãªã®ã§ãããŸããã£ãã·ã¥ãå¹ãããšã¯æåŸ ã§ããªããšæãããŸãã
æåŸã«ãåæã¢ã¯ã»ã¹æ°ãäžããŠããŒã¹ãšæ¯èŒããŠã¿ãŸãã
ç§ã®æå
ã®ç°å¢ã ãšããŸãšãã«æããã®ã¯30QPSã»ã©ã®ããã§ãã®ã§ããã®å€ã§èšæž¬ããããšã«ããŸãã
| åæã¢ã¯ã»ã¹æ° | QPS |
|---|---|
| 100vu | 30QPS |

q=*:*ã®ãšã(ããŒã¹)

q={!knn ...}ã®ãšã
æåã«å€§ããªå±±ãããã®ã§ AVG ã倧ããã«åºãŠããŸãããå®å®åã®ã¬ã¹ãã³ã¹ã¿ã€ã ã¯120msååŸã§ãã
ãã¯ãé«è² è·ãããããšã©ãããŠãã¬ã¹ãã³ã¹ã¿ã€ã ãžã®åœ±é¿ã¯åºãŠããããã§ããã
ããã§ããŸããŸãæªããªãé床ãšèšããã®ã§ã¯ãªãã§ããããã
ã€ã³ããã¯ã¹ãµã€ãº
ã€ã³ããã¯ã¹ãµã€ãºã枬ã£ãŠã¿ãŸããã
å
ã»ã©ã® Wikipedia ã®ãã³ãããŒã¿120äžä»¶ã«å¯ŸããŠ200次å
ã§ embedding ãããšãã®ã€ã³ããã¯ã¹ãµã€ãºã¯ä»¥äžã®éãã«ãªããŸããã
| ãã¯ãã«ãªã | ãã¯ãã«ãã |
|---|---|
| 8.69G | 12.28GB |
ããã¥ã¡ã³ãã®ã¿ã«æ¯ã¹ãŠ1.5åãããã«ãªããŸããã
æ°å€ããŒã¿ã ããšã¯ãããæ°çŸæ¬¡å
ã®ããŒã¿ãšãªãã°ãããªãã®ã€ã³ããã¯ã¹ãµã€ãºã«ãªãããã§ãã
ãããã«
ä»å㯠Solr9 ããå°å ¥ãããå¯ãã¯ãã«æ€çŽ¢æ©èœã«ã€ããŠèª¿ã¹ãŠã¿ãŸããã
embedding ããã§ããŠããã°ãSolr äžã§ã®äœ¿ãæ¹ã¯é£ãããªããæ§èœãæªããªãããã§ãã
Solr ã§ã®ãã¯ãã«æ€çŽ¢ã䜿ãã°ãå
šææ€çŽ¢ãšã³ãžã³ã®ããŠããŠãçããã€ã€ããããŸã§å
šææ€çŽ¢ã§ã¯å®çŸã§ããªãã£ãããšãã§ããããã«ãªããŸãã
æ¬èšäºãèªãã§èå³ãæã£ãŠããã ããã®ãªããæ¯éãäžåºŠæ€èšããŠã¿ãŠã¯ã
䜿çšããããŒã¿ã»ãã
- livedoor ãã¥ãŒã¹ã³ãŒãã¹
- 京éœå€§åŠããã¹ãã³ãŒãã¹
- 京éœå€§åŠãŠã§ãææžãªãŒãã³ãŒãã¹
- Food-101 Data Set
-
Groovenauts ã«ãããã¢ãµã€ãã§ã¯GCPã®ãµãŒãã¹ã®1ã€ã§ãã Vertex AI Matching Engine ã䜿ãããŠããŸããVertex AI Matching Engine ã«ã€ããŠã¯ãå ¬åŒããã¥ã¡ã³ããããããããã§ããããã¡ãã®ããã°èšäºã端çã«è¯ããŸãšãŸã£ãŠãŠããŸããhttps://www.topgate.co.jp/blog/google-service/20766 â©ïž
-
å è«æãã®1 â©ïž
-
å è«æãã®2 â©ïž
-
æŸäºå çã«ãã解説ããšã£ãŠããããããã â©ïž
-
Julia ã§ã®å®è£ äŸ â©ïž
-
Faiss ã§ã®å®è£ äŸã亀ããªãã HNSW ã®ã¢ã«ãŽãªãºã 詳现ãå³èª¬ããããã°èšäº â©ïž
-
200次å 㯠Word2Vec ã512次å 㯠CLIP(rinna ç€Ÿãæ¥æ¬èªã§ pre-trained ãããã¢ãã« https://huggingface.co/rinna/japanese-clip-vit-b-16 )ã䜿ã£ãŠããŸãã â©ïž
-
ãã³ãããŒã¿å šäœã ãš300äžä»¶ã»ã©ãããŸããããç§ã®æå ã®ãã·ã³ã¹ããã¯çã«ãããéçã§ããã â©ïž
Discussion