ã¯ããã« ããã«ã¡ã¯ãã¡ãŒã«ãã£ãŒã©ãŒAIéçºèª²ã®marronã§ãããšã³ãžãã¢ããã°åæçš¿ãšãªããŸãããããããé¡ãããŸãã ç§ãæå±ããŠããã¡ãŒã«ãã£ãŒã©ãŒAIéçºèª²ã§ã¯ãäž»ã«ã¡ãŒã«ãã£ãŒã©ãŒã«æèŒãããAIæ©èœã®éçºãæ
åœããŠããŸãã çŸåšã¯10æã«ãªãªãŒã¹äºå®ã®åçèªåçæãšãŒãžã§ã³ãã®éçºãé²ããŠããŸãã ãã®æ©èœãéçºããã«ããã£ãŠãæ°ãã«ãã¯ãã«DBãå©çšãããã¬ããžã®æ€çŽ¢æ©èœãå¿
èŠãšãªããŸããã æ¬èšäºã§ã¯ããã¯ãã«DBã§ã®æ€çŽ¢ç²ŸåºŠãäžããããã«å°å
¥ãããã€ããªããæ€çŽ¢ã«ã€ããŠã玹ä»ããŸãã ã¯ããã« ãã¯ãã«DBã®éžå® ãã¯ãã«DBãšã¯ ã¡ãŒã«ãã£ãŒã©ãŒã§æ¡çšãããã¯ãã«DB å¯ãã¯ãã«ãçšããæ€çŽ¢ Qdrantã§ã®å¯ãã¯ãã«æ€çŽ¢ å¯ãã¯ãã«æ€çŽ¢ã®æ¬ ç¹ çãã¯ãã«ãçšããæ€çŽ¢ çãã¯ãã«ãšã¯ Qdrantã§ã®çãã¯ãã«æ€çŽ¢ äž¡æ¹ã®æ€çŽ¢çµæãçµã¿åããããã€ããªããæ€çŽ¢ å¯ãã¯ãã«ãšçãã¯ãã«ã®äž¡æ¹ã掻çšãã Qdrantã§ã®ãã€ããªããæ€çŽ¢ ãŸãšã åèæç® ãã¯ãã«DBã®éžå® ãã¯ãã«DBãšã¯ ããããããã¯ãã«DBãšã¯ãªãããããšããæ¹ãããã£ããããšæããŸãã®ã§ãç°¡åã«èª¬æãããŠããã ããŸãã éçºäžã®æ©èœã§ã¯ãéå»ã®å¯Ÿå¿å±¥æŽãFAQãããšã«äœæãããã¬ããžããåãåããã®åçã«å¿
èŠãšãªãæ
å ±ãæ€çŽ¢ããŸãã ãã¬ããžã®æ€çŽ¢ã«ã¯å
šææ€çŽ¢ãå©çšããããŒã¯ãŒãæ€çŽ¢ãçšããŠãè¯ãã®ã§ãããããŒã¯ãŒãæ€çŽ¢ã®å Žåã¯åãåããã«å«ãŸããããŒã¯ãŒãããã¬ããžã«å«ãŸããããŒã¯ãŒããšå°ãã§ãç°ãªããšæ
å ±ããããããŸããã ãã®åé¡ã解決ããããã«ããã¬ããžãåãåãããæ°å€ãã¯ãã«åããŠãã¯ãã«ã®è¿ãã«ããæ€çŽ¢ãè¡ããŸãããã®æ°å€ãã¯ãã«ã¯ãæç« å
šäœãã©ããã£ãæå³ã瀺ããŠãããã倿¬¡å
ã§è¡šãããã®ã«ãªããŸãã æ€çŽ¢æã¯ãã¯ãã«å士ã®è·é¢ã枬ãããšã§ãè·é¢ãè¿ã = æå³ã䌌ãŠããããŒã¿ãèŠã€ããããšãã§ããŸãããã¯ãã«åïŒåã蟌ã¿è¡šçŸïŒã«ã€ããŠã¯åèæç®ããåç
§ãã ããã ãã®ãã¯ãã«ããŒã¿ãä¿åããã®ã«å©çšããã®ããã¯ãã«DBã«ãªããŸãããã¯ãã«DBã¯ãã¯ãã«ããŒã¿ãä¿åããããšã«ç¹åããŠãããèšå€§ãªãã¯ãã«ããŒã¿å士ã®è·é¢èšç®ãå¹çããé«éã«è¡ã£ãŠããããã®ã«ãªããŸãã ã¡ãŒã«ãã£ãŒã©ãŒã§æ¡çšãããã¯ãã«DB ã¡ãŒã«ãã£ãŒã©ãŒã§ãã¯ãã«DBãå©çšããã®ã¯2åç®ãªã®ã§ãããååæ¡çšããChromaDBã§ã¯ä»åã®æ©èœãæäŸããã«ããã£ãŠããã©ãŒãã³ã¹é¢ã§äžå®ããããŸããã ãã®ãããå¥éãã¯ãã«DBå°çšã®ãµãŒããæ§ç¯ããããšã«ããŸããã å©çšããDBãéžå®ããããã«ä»¥äžã®ãããªæ¡ä»¶ãæºãã補åãæ¢ãããšã«ããŸããã ãªã³ãã¬ãã¹ç°å¢ã§åäœããããš ãã«ãããã³ãæ§æã«å¯Ÿå¿ã§ããããš è€æ°å°ãµãŒããçšããè² è·åæ£ãè¡ããããš ãã®æ¡ä»¶ãæºãã補åãšããŠãMilvusããQdrantããPGVectorããåè£ãšããŠãããã©ãŒãã³ã¹ã䜿ãããããæ¯èŒããŸããã çµè«ãšããŠã¯ã¿ã€ãã«ã«ãããéããQdrantãæ¡çšããããšã«ããŸãããçç±ã¯äžèšã®éãã§ãã Rust補ã§ãé«éã«æ€çŽ¢ãè¡ããããšã謳ã£ãŠãã Dockerã³ã³ããã ãã§ãªããåäœãã€ããªãšããŠãé
åžãããŠããããªã³ãã¬ãã¹ã®ãµãŒãã«å°å
¥ãããã ãã«ãããã³ãã§ã®éçšæ¹æ³ãããã¥ã¡ã³ãã«èšèŒãããŠãããã€ã³ããã¯ã¹ã®æé©åæ¹æ³ãŸã§èšèŒãããŠãã ç°¡åãªèšå®ã§åæ£ç°å¢ãæ§ç¯ããããšãã§ãã å©çšãããã¯ãã«DBãæ±ºå®ããã®ã§ãå®éã«å©çšããŠã¿ãŸãã å¯ãã¯ãã«ãçšããæ€çŽ¢ Qdrantã§ã®å¯ãã¯ãã«æ€çŽ¢ æåã«èª¬æããæç« å
šäœã®æå³åãã瀺ãããã¯ãã«ããŒã¿ãå¯ãã¯ãã«ïŒDense VectorïŒãšåŒã³ãŸãããŸãã¯ãã®å¯ãã¯ãã«ãå©çšããæ€çŽ¢ãè¡ã£ãŠã¿ãŸãã ãã¯ãã«ããŒã¿ãæå
¥ããããã«Qdrantäžã«ã³ã¬ã¯ã·ã§ã³ãæºåããŸãã ä»åã®ãµã³ãã«ã³ãŒãã¯ãã¹ãŠPythonã§èšèŒããŠããŸãããŸããQdrantå
¬åŒã®Dockerã€ã¡ãŒãžãå©çšããŠç°å¢ãæ§ç¯ããŠããŸãã from qdrant_client import QdrantClient, models qdrant = QdrantClient(url= "http://localhost:6333" ) qdrant.create_collection( collection_name= "dense_collection" , vectors_config=models.VectorParams(size= 1536 , distance=models.Distance.COSINE) ) size ã«ã¯ãã¯ãã«ããŒã¿ã®æ¬¡å
æ°ãæå®ããŸããä»åã¯OpenAIã®Embeddings APIã«ãããã¯ãã«åãè¡ããã¢ãã«ã« text-embedding-3-small ãå©çšããããã1536次å
ãæå®ããŠããŸãã distance ã«ã¯ãã¯ãã«ããŒã¿ã®è·é¢èšç®ã«å©çšããæ¹åŒãæå®ããŸããä»åã¯ããã¹ãã®é¡äŒŒåºŠã調ã¹ãã®ã«æé©ãšãããã³ãµã€ã³é¡äŒŒåºŠãæå®ããŠããŸãã ã³ã¬ã¯ã·ã§ã³ãäœæåºæ¥ãããæ€çŽ¢å¯Ÿè±¡ã®ããŒã¿ãä¿åããŸããä»åã¯ChatGPTãå©çšããŠã5ã€ã®ç«çš®ã®ç¹åŸŽã20ä»¶ãã€æç« ã«ããŠããããèš100ä»¶ã®ããŒã¿ãæå
¥ããŸããã ã¢ã¡ãªã«ã³ã·ã§ãŒããã¢ã¯çè質ã§ããã ã¹ã³ãã£ãã·ã¥ãã©ãŒã«ãã¯è³ãæããŠããç«ã§ããã ã¡ã€ã³ã¯ãŒã³ã¯äžçæå€§çŽã®ç«ã§ããã ã·ã£ã ã¯ç€Ÿäº€çãªç«ã§ããã ãã«ã·ã£ã¯é·æ¯ã®ç«ã§ããã ... from qdrant_client import QdrantClient, models from openai import OpenAI qdrant = QdrantClient( "http://localhost:6333" ) openai = OpenAI() with open ( "cat.txt" , "r" , encoding= "utf-8" ) as f: for idx, line in enumerate (f): line = line.strip() response = openai.embeddings.create( input =line, model= "text-embedding-3-small" ) vector = response.data[ 0 ].embedding qdrant.upsert( collection_name= "dense_collection" , points=[ models.PointStruct( id =idx, vector=vector, payload={ "text" : line} ) ] ) Qdrantã§ã¯ãã¯ãã«ä»¥å€ã®ããŒã¿ãpayloadãšãã圢åŒã§ä¿æããŸããä»åã¯ãã¯ãã«åå¯Ÿè±¡ã®æç« ãpayloadã«ä¿æããããã«ããŠããŸãã æºåãåºæ¥ãã®ã§ãæå
¥ããããŒã¿ã«å¯ŸããŠæ€çŽ¢ãè¡ã£ãŠã¿ãŸãã from qdrant_client import QdrantClient, models from openai import OpenAI qdrant = QdrantClient( "http://localhost:6333" ) openai = OpenAI() query = "ç©ãããªæ§æ Œã®ç«" response = openai.embeddings.create( input =query, model= "text-embedding-3-small" ) vector = response.data[ 0 ].embedding search_result = qdrant.query_points( collection_name= "dense_collection" , query=vector, with_payload= True , limit= 5 ) for point in search_result.points: print (f "Score: {point.score}, Text: {point.payload['text']}" ) å®è¡çµæããã¡ãã«ãªããŸãã Score: 0.6045555, Text: ã¡ã€ã³ã¯ãŒã³ã¯èœã¡çããé°å²æ°ãæã€ç«ã§ããã Score: 0.59054977, Text: ãã«ã·ã£ã¯åªé
ãªé°å²æ°ãæã€ç«ã§ããã Score: 0.565565, Text: ãã«ã·ã£ã¯éããªç掻ã奜ãç«ã§ããã Score: 0.55805016, Text: ãã«ã·ã£ã¯ç©ãããªæ§æ Œã§ããã Score: 0.5490287, Text: ã¹ã³ãã£ãã·ã¥ãã©ãŒã«ãã¯éããªç°å¢ã奜ãç«ã§ããã ç¡äºäŒŒãŠããæç« ãæ€çŽ¢ããããšãåºæ¥ãŸããã ãã®ãšãã®ã¹ã³ã¢ã¯ãã¯ãã«ã®é¡äŒŒåºŠã瀺ããŠãããã³ãµã€ã³é¡äŒŒåºŠãå©çšããæã¯å€ã倧ãããã®ã»ã©äŒŒãŠããããšã瀺ããŠããŸãã å¯ãã¯ãã«æ€çŽ¢ã®æ¬ ç¹ å¯ãã¯ãã«ãå©çšããæ€çŽ¢ã§ã¯æç« ã䌌ãŠãããã©ããã«çç®ããŠæ€çŽ¢ãè¡ããŸãã ãã®ãšãããããŸã§é¡äŒŒåºŠã«çç®ããŠæ€çŽ¢ãè¡ããããå
šãåãããŒã¯ãŒããå«ãã§ãããã«ã¯çç®ããŠããŸãããããã匱ç¹ãšãªããã¿ãŒã³ããããŸãã äŸãã°ããââã§ã¯Aãã¿ã³ã決å®ãšããŠäœ¿ãããšãÃÃã§ã¯Bãã¿ã³ã決å®ãšããŠäœ¿ãããšãããã¬ããžããã£ããšããŸãã ãã®ãšãã«ãââã§ã¯ã©ã®ãã¿ã³ã決å®ã§ããïŒããšããåãåããããã£ãå Žåã«åè
ã®æ
å ±ã䜿ãããã®ã«ãããããããåŸè
ã®æ
å ±ãååŸããå¯èœæ§ããããŸããããã§ã¯åçæãšããŠå©çšã§ããŸããã ããã§ããŒã¯ãŒãæ€çŽ¢ãšåãä»çµã¿ããã¯ãã«æ€çŽ¢ã§ãè¡ããããã«ããŸãã çãã¯ãã«ãçšããæ€çŽ¢ çãã¯ãã«ãšã¯ ããŒã¯ãŒãæ€çŽ¢ãè¡ãããã«ã¯æç« å
ã«ã©ã®ãããªåèªãå«ãŸããŠããããç¥ãå¿
èŠããããŸããããã§å©çšããã®ãçãã¯ãã«ïŒSparse VectorïŒã«ãªããŸãã å¯ãã¯ãã«ã§ã¯ãã¯ãã«å
ã®å€ã0以å€ã§ããããšãå€ãã®ã§ãããçãã¯ãã«ã§ã¯åèªã®é »åºåºŠã決ãŸã£ãåèªãšã®é¡äŒŒåºŠã瀺ãããããã¯ãã«å
ã®å€ã0ã§ããããšãå€ãã§ãããã®ãããå€ãã¹ã«ã¹ã«ã®ãã¯ãã«ãšããæå³ã§çãã¯ãã«ãšåŒã°ããŸãã çãã¯ãã«åå£«ãæ¯èŒããããšã§åèªããšã®é »åºåºŠã調ã¹ãæ€çŽ¢ãããããŒã¯ãŒããå€ãå«ãŸããæç« ãåãåºãããšãåºæ¥ãŸãã Qdrantã§ã®çãã¯ãã«æ€çŽ¢ Qdrantã§ã¯1ã€ã®æç« ã«å¯ŸããŠãå¯ãã¯ãã«ãšçãã¯ãã«ã®äž¡æ¹ãä¿æããããšãåºæ¥ãŸãã ãã ããæ¢åã®ã³ã¬ã¯ã·ã§ã³ã«å¯ŸããŠãä¿æãããã¯ãã«ã®åæ°ã圢ç¶ã倿Žããããšãã§ããªããããæ°ãã«ã³ã¬ã¯ã·ã§ã³ãäœæããŸãã from qdrant_client import QdrantClient, models qdrant = QdrantClient(url= "http://localhost:6333" ) qdrant.create_collection( collection_name= "sparse_collection" , vectors_config={ "dense" : models.VectorParams(size= 1536 , distance=models.Distance.COSINE)}, sparse_vectors_config={ "sparse" : models.SparseVectorParams()} ) 次ã«å¯ãã¯ãã«ãšäžç·ã«çãã¯ãã«ãæå
¥ããŸãã å¯ãã¯ãã«ã¯OpenAI APIãå©çšããããšã§çæããããšãåºæ¥ãŸãããçãã¯ãã«ãçæããAPIã¯æäŸãããŠããŸããã ãã®ãããçãã¯ãã«åã¯èªãè¡ãå¿
èŠããããŸãã ãŸããä»åçãã¯ãã«åã«ã¯QdrantãæäŸããŠããã©ã€ãã©ãªãæ¡çšããã®ã§ããããã®ã©ã€ãã©ãªã¯æ¥æ¬èªã®ããŒã¯ã³åïŒæç« ã®åèªãåãåããåŠçïŒã«å¯Ÿå¿ããŠããŸããããã®ãããããŒã¯ã³åã®åŠçãèªåã§å®è£
ããå¿
èŠããããŸãã çãã¯ãã«åã®åŠçã¯åèæç®ãå
ã«å®è£
ããŠããŸããä»åã®ãµã³ãã«ããã°ã©ã ã§ã¯ãã®çãã¯ãã«åã®åŠçã«ã€ããŠã¯çç¥ãããŠããã ããŸãã å¯ãã¯ãã«ã®ãšããã§å©çšãã100ä»¶ã®ããŒã¿ããäœæããå¯ãã¯ãã«ãšçãã¯ãã«ãæå
¥ããŸãã from qdrant_client import QdrantClient, models from openai import OpenAI qdrant = QdrantClient( "http://localhost:6333" ) openai = OpenAI() # TextEmbedderã®å®è£
ã«ã€ããŠã¯çç¥ embedder = TextEmbedder() with open ( "cat.txt" , "r" , encoding= "utf-8" ) as f: for idx, line in enumerate (f): line = line.strip() response = openai.embeddings.create( input =line, model= "text-embedding-3-small" ) dense_vector = response.data[ 0 ].embedding sparse_vector = embedder.embed_query(query_text=line) qdrant.upsert( collection_name= "sparse_collection" , points=[ models.PointStruct( id =idx, vector={ "dense" : dense_vector, "sparse" : models.SparseVector( indices=sparse_vector.indices.tolist(), values=sparse_vector.values.tolist(), ) }, payload={ "text" : line} ) ] ) çãã¯ãã«ã ãã䜿ã£ãŠæ€çŽ¢ãè¡ã£ãŠã¿ãŸãã from qdrant_client import QdrantClient, models from openai import OpenAI qdrant = QdrantClient( "http://localhost:6333" ) openai = OpenAI() query = "ç©ãããªæ§æ Œã®ç«" # TextEmbedderã®å®è£
ã«ã€ããŠã¯çç¥ embedder = TextEmbedder() sparse_vector = embedder.embed_query(query_text=query) search_result = qdrant.query_points( collection_name= "sparse_collection" , query=models.SparseVector( indices=sparse_vector.indices.tolist(), values=sparse_vector.values.tolist() ), using= "sparse" , with_payload= True , limit= 5 ) for point in search_result.points: print (f "Score: {point.score}, Text: {point.payload['text']}" ) å®è¡çµæããã¡ãã«ãªããŸãã Score: 2.0, Text: ã¹ã³ãã£ãã·ã¥ãã©ãŒã«ãã¯ç©ãããªæ§æ Œã§ããã Score: 2.0, Text: ãã«ã·ã£ã¯ç©ãããªæ§æ Œã§ããã Score: 2.0, Text: ã¢ã¡ãªã«ã³ã·ã§ãŒããã¢ã¯ç©ãããªæ§æ Œã§ããã Score: 2.0, Text: ã¡ã€ã³ã¯ãŒã³ã¯ç©ãããªæ§æ Œã§ããã Score: 1.0, Text: ã¡ã€ã³ã¯ãŒã³ã¯åã©ããšä»²è¯ãã§ããç«ã§ããã åèªåäœã§äŒŒãŠããæç« ãåãåºããŠããããšãåãããŸãã ãã®ãšãã®ã¹ã³ã¢ã¯äŒŒãŠããåèªãã©ã®çšåºŠæç« ã«å«ãŸããŠãããã瀺ããŠããŸãã äž¡æ¹ã®æ€çŽ¢çµæãçµã¿åããããã€ããªããæ€çŽ¢ å¯ãã¯ãã«ãšçãã¯ãã«ã®äž¡æ¹ã掻çšãã ããã§æç« ã®é¡äŒŒåºŠã«ããæ€çŽ¢ãšããŒã¯ãŒããå©çšããæ€çŽ¢ãè¡ããããã«ãªããŸããã ãã®2çš®é¡ã®æ€çŽ¢æ¹æ³ã¯äºãã®åŒ±ç¹ãè£ããã®ã§ãã®ã§ãæ€çŽ¢çµæãçµ±åããããšã§ç²ŸåºŠãäžããããšãåºæ¥ãŸãã åé¡ã¯ãã®2ã€ã®æ€çŽ¢çµæãã©ããã£ãŠçµ±åãããã§ããããããã®æ€çŽ¢çµæãå
ã«é¡äŒŒåºŠãé«ãæç« ãåãåºãããã®ã§ãããããã®ã¹ã³ã¢ïŒé äœïŒããå床ã¹ã³ã¢èšç®ãè¡ãå¿
èŠããããŸãã ãã®ä»çµã¿ããã€ããªããæ€çŽ¢ãšåŒã³ãŸãããã€ããªããæ€çŽ¢ãç°¡åã«è¡ããæ¹æ³ãQdrantãæäŸããŠããŸãã®ã§ãå®éã«äœ¿ã£ãŠã¿ãŸãã Qdrantã§ã®ãã€ããªããæ€çŽ¢ Qdrantã§ãã€ããªããæ€çŽ¢ãè¡ãå ŽåããŸã prefetch ãšããæ©èœã§å
ã«å¯ãã¯ãã«ãçãã¯ãã«ã®ããããã®æ€çŽ¢çµæãäœæããŠãããŸãã ãã®åŸãæ€çŽ¢çµæãçµ±åããããã«æ€çŽ¢ã¯ãšãªã« fusion ãæå®ããŸãããã®ãšããçµ±åããæ¹æ³ã«ã¯RRFææ³ãšDBSFææ³ãå©çšã§ããŸãã RRFææ³ã¯æ€çŽ¢çµæã®é äœã«åºã¥ããŠæ°ããã¹ã³ã¢ãèšç®ããŸããäžæ¹ãDBSFææ³ã¯æ€çŽ¢çµæãã®ãã®ã®ã¹ã³ã¢ãå©çšããŠæ°ããã¹ã³ã¢ãç®åºããŸãã RRFææ³ã¯é äœããŒã¹ã®ãããç°ãªãæ§è³ªãæã€ãã¯ãã«ïŒä»åã®å Žåã¯å¯ãã¯ãã«ãšçãã¯ãã«ïŒãæ¯èŒããéã«æå¹ã§ããããã§ä»åã¯RRFææ³ãæ¡çšããŸããã éã«ãåçš®ã®ãã¯ãã«ã§å
容ãç°ãªãè€æ°ã®æ€çŽ¢çµæãçµ±åããå Žåã«ã¯ãDBSFææ³ã®æ¹ãé©ããŠãããšèããããŸããææ³ã®è©³ããå
容ã«ã€ããŠã¯åèæç®ããåç
§ãã ããã ã§ã¯ããã€ããªããæ€çŽ¢ãå®éã«è¡ã£ãŠã¿ãŸããã³ã¬ã¯ã·ã§ã³ã¯çãã¯ãã«ã®æã«äœæãããã®ãå©çšããŸãã from qdrant_client import QdrantClient, models from openai import OpenAI qdrant = QdrantClient( "http://localhost:6333" ) openai = OpenAI() query = "ç©ãããªæ§æ Œã®ç«" response = openai.embeddings.create( input =query, model= "text-embedding-3-small" ) dense_vector = response.data[ 0 ].embedding # TextEmbedderã®å®è£
ã«ã€ããŠã¯çç¥ embedder = TextEmbedder() sparse_vector = embedder.embed_query(query_text=query) search_result = qdrant.query_points( collection_name= "sparse_collection" , prefetch=[ models.Prefetch( query=dense_vector, using= "dense" , limit= 5 ), models.Prefetch( query=models.SparseVector( indices=sparse_vector.indices.tolist(), values=sparse_vector.values.tolist() ), using= "sparse" , limit= 5 ) ], query=models.FusionQuery(fusion=models.Fusion.RRF), with_payload= True , limit= 3 ) for point in search_result.points: print (f "Score: {point.score}, Text: {point.payload['text']}" ) æ€çŽ¢çµæãçµ±åãããããprefetchã§ååŸããä»¶æ°ã¯æçµçã«å¿
èŠãªä»¶æ°ãã倧ããããŠããå¿
èŠããããŸããprefetchã®ååŸä»¶æ°ãå°ãªããšçµ±åããéã«ã©ã¡ããã®ãã¯ãã«ã«åã£ãããŒã¿ãååŸãããŠããŸããŸãã å®è¡çµæããã¡ãã«ãªããŸãã Score: 0.53333336, Text: ãã«ã·ã£ã¯ç©ãããªæ§æ Œã§ããã Score: 0.5, Text: ã¡ã€ã³ã¯ãŒã³ã¯èœã¡çããé°å²æ°ãæã€ç«ã§ããã Score: 0.5, Text: ã¹ã³ãã£ãã·ã¥ãã©ãŒã«ãã¯ç©ãããªæ§æ Œã§ããã æç« ã®é¡äŒŒåºŠãšåèªåäœã§ã®é¡äŒŒåºŠãå
ã«æç« ãåãåºããŠããŸãã ãã®ãšãã®ã¹ã³ã¢ã¯ããããã®ãã¯ãã«ã§ã®é äœãå
ã«ç®åºããããã®ãšãªããŸãã ãŸãšã Qdrantãå©çšãããã€ããªããæ€çŽ¢ãæŽ»çšããããšã§ããã¬ããžã®æ€çŽ¢ç²ŸåºŠãåäžãããŸããã ã¿ãªãããRAGã®ãããªæç« æ€çŽ¢ãè¡ãå Žé¢ããããŸãããããã²ãã€ããªããæ€çŽ¢ãå©çšãã粟床åäžãè¡ã£ãŠã¿ãŠãã ããã åèæç® atmarkit.itmedia.co.jp qdrant.tech qiita.com dev.classmethod.jp