46.5kćƒ‡ćƒ¢ć‚’äŗˆē“„ć™ć‚‹ćƒ­ć‚°ć‚¤ćƒ³ē„”ę–™ć§å§‹ć‚ć‚‹

šŸš€ Milvus v2.4.3ć®ćƒ”ć‚æćƒ‡ćƒ¼ć‚æćƒ•ć‚£ćƒ«ć‚æćƒŖćƒ³ć‚°ć®ę–°ę©Ÿčƒ½

Jun 16, 20241 min read

Milvus v2.4.3ćÆå®Œå…ØćŖę–‡å­—åˆ—ćƒ”ć‚æćƒ‡ćƒ¼ć‚æćƒžćƒƒćƒćƒ³ć‚°ć‚’å°Žå…„ć—ć¾ć—ćŸļ¼ć“ć‚Œć«ć‚ˆć‚Šć€ęŽ„é ­č¾žć€ęŽ„å°¾č¾žć€ęŽ„å°¾č¾žć€ć‚ć‚‹ć„ćÆę–‡å­—ćƒÆć‚¤ćƒ«ćƒ‰ć‚«ćƒ¼ćƒ‰ę¤œē“¢ć‚’ä½æē”Øć—ć¦ę–‡å­—åˆ—ć‚’ćƒžćƒƒćƒćƒ³ć‚°ć§ćć‚‹ć‚ˆć†ć«ćŖć‚Šć¾ć—ćŸć€‚

# ęŽ„é ­č¾žć®ä¾‹ć€"The "ć§å§‹ć¾ć‚‹ę–‡å­—åˆ—ć«ćƒžćƒƒćƒć—ć¾ć™ć€‚
expression='title like "The%"'.
# ć‚¤ćƒ³ćƒ•ć‚£ć‚Æć‚¹ć®ä¾‹: 文中のどこかに "the "ć‚’å«ć‚€ę–‡å­—åˆ—ć«ćƒžćƒƒćƒć—ć¾ć™ć€‚
expression='怌%the%ć€ć®ć‚ˆć†ćŖć‚æć‚¤ćƒˆćƒ«'
# Postfixの例: "Rye "ć§ēµ‚ć‚ć‚‹ę–‡å­—åˆ—ć«ćƒžćƒƒćƒć—ć¾ć™ć€‚
expression='怌%Ryeć€ć®ć‚ˆć†ćŖć‚æć‚¤ćƒˆćƒ«'
# 1ę–‡å­—ć®ćƒÆć‚¤ćƒ«ćƒ‰ć‚«ćƒ¼ćƒ‰ć®ä¾‹.
expression='title like "Flip_ed"'.

ä»„å‰ć®ćƒ–ćƒ­ć‚°ć§ćÆć€ęŽ„é ­č¾žę–‡å­—åˆ—ćƒžćƒƒćƒćƒ³ć‚°ć«ć¤ć„ć¦ć®ćæčŖ¬ę˜Žć—ć¾ć—ćŸć€‚ć—ć‹ć—ć€Milvus v2.4.3ä»„é™ć§ćÆć€é…åˆ—å€¤ć‚’ä½æć£ćŸå®Œå…Øäø€č‡“ć‚„ć€é…åˆ—å†…ć®č¦ē“ ćŒäø€č‡“ć™ć‚‹ć‹ć©ć†ć‹ć®ćƒć‚§ćƒƒć‚Æ(contains_any())ćŖć©ć€ć‚ć‚‰ć‚†ć‚‹ćƒćƒŖć‚Øćƒ¼ć‚·ćƒ§ćƒ³ćŒåÆčƒ½ć«ćŖć£ć¦ć„ć¾ć™ć€‚šŸ—‚ļøšŸ”

ć“ć‚Œć‚‰ć®ć‚¢ćƒƒćƒ—ćƒ‡ćƒ¼ćƒˆć«ć‚ˆć‚Šć€ćƒ”ć‚æćƒ‡ćƒ¼ć‚æć®ćƒ•ć‚£ćƒ«ć‚æćƒŖćƒ³ć‚°ćŒć‚ˆć‚Šå¤šę©Ÿčƒ½ć§å¼·åŠ›ćŖć‚‚ć®ć«ćŖć‚Šć¾ć—ćŸļ¼

ä¾‹ć§čŖ¬ę˜Žć—ć¾ć—ć‚‡ć†ć€‚ć“ć®ćƒ–ćƒ­ć‚°ć§ćÆć€Kaggleć‹ć‚‰ćƒ€ć‚¦ćƒ³ćƒ­ćƒ¼ćƒ‰ć—ćŸIMDBę˜ ē”»ćƒ‡ćƒ¼ć‚æć‚’ä½æć†ć“ćØć«ć™ć‚‹ć€‚

# äø€čˆ¬ēš„ćŖćƒ©ć‚¤ćƒ–ćƒ©ćƒŖć‚’ć‚¤ćƒ³ćƒćƒ¼ćƒˆć™ć‚‹ć€‚
ć‚¤ćƒ³ćƒćƒ¼ćƒˆ sys, os, time, pprint
import pandas as pd

# CSVćƒ‡ćƒ¼ć‚æć‚’čŖ­ćæč¾¼ć‚€ć€‚
df = pd.read_csv("data/original_data.csv")

# ćƒ‡ćƒ¢ē”Øć«ćƒ‡ćƒ¼ć‚æć‚’ć‚·ćƒ§ćƒ¼ćƒˆć‚«ćƒƒćƒˆć™ć‚‹ć€‚
df = df.tail(200)
蔨示(df.head())

å„ę˜ ē”»ć«ćÆ'text'ćƒ•ć‚£ćƒ¼ćƒ«ćƒ‰ćŒć‚ć‚Šć€čŖ¬ę˜ŽćØćƒ¬ćƒ“ćƒ„ćƒ¼ćŒč”Øē¤ŗć•ć‚Œć¾ć™ć€‚šŸ“

å„ę˜ ē”»ć«ćÆć€å…¬é–‹å¹“ć€ćƒ¬ćƒ¼ćƒ†ć‚£ćƒ³ć‚°ć€ć‚øćƒ£ćƒ³ćƒ«ć€äæ³å„Ŗć€ć‚­ćƒ¼ćƒÆćƒ¼ćƒ‰ć®ćƒŖć‚¹ćƒˆćŖć©ć®ćƒ”ć‚æćƒ‡ćƒ¼ć‚æćŒå«ć¾ć‚Œć¦ć„ć¾ć™ć€‚šŸŽ¬ā­ļøšŸ“…

各 "蔌 "ćÆć€ę˜ ē”»ćƒ¬ćƒ“ćƒ„ćƒ¼ć®ćƒ†ć‚­ć‚¹ćƒˆćƒćƒ£ćƒ³ć‚Æć€ćć®ćƒ™ć‚Æćƒˆćƒ«č”Øē¾ć€movie_idć€ę˜ ē”»ć‚æć‚¤ćƒˆćƒ«ć€ćƒć‚¹ć‚æćƒ¼ćƒŖćƒ³ć‚Æć€ć‚øćƒ£ćƒ³ćƒ«ć€äæ³å„ŖćŖć©ć®ćƒ”ć‚æćƒ‡ćƒ¼ć‚æć‚’č”Øć™ć€‚

é€šåøøć®RAGćƒ‘ć‚æćƒ¼ćƒ³ć«å¾“ć†: šŸ“šŸ«ƒć€‚

1.Milvusć«ęŽ„ē¶šć™ć‚‹ļ¼šć¾ćšć€Milvusć®ćƒ­ćƒ¼ć‚«ćƒ«å±•é–‹ć§ć‚ć‚‹Milvus Liteć«ęŽ„ē¶šć™ć‚‹ć€‚ć“ć‚ŒćÆćƒ™ć‚Æć‚æćƒ¼ć‚’äæå­˜ćƒ»ē®”ē†ć™ć‚‹ćŸć‚ć®ćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ć§ć‚ć‚‹ć€‚šŸ–„ļøšŸ”—

2.ę˜ ē”»ć®ćƒ†ć‚­ć‚¹ćƒˆć‚’ćƒ™ć‚Æćƒˆćƒ«ć«å¤‰ę›ć—ć¾ć™ļ¼šå„ę˜ ē”»ć®ćƒ†ć‚­ć‚¹ćƒˆćƒ•ć‚£ćƒ¼ćƒ«ćƒ‰ļ¼ˆčŖ¬ę˜ŽćØćƒ¬ćƒ“ćƒ„ćƒ¼ć‚’å«ć‚€ļ¼‰ć‚’å–ć‚Šå‡ŗć—ć€ćƒ™ć‚Æć‚æćƒ¼ć«å¤‰ę›ć—ć¾ć™ć€‚ć“ć‚Œć«ćÆHuggingFacećƒ¢ćƒ‡ćƒ«** BAAI/bge-large-en-v1.5 ć‚’ä½æć„ć¾ć™ć€‚šŸ§ āž”ļøšŸ“

3.ćƒ™ć‚Æć‚æćƒ¼ćØćƒ”ć‚æćƒ‡ćƒ¼ć‚æć‚’Milvusć«ęŒæå…„ć—ć¾ć™ļ¼šć“ć®ćƒ™ć‚Æćƒˆćƒ«ć‚’ć€å…ƒć®ćƒ†ć‚­ć‚¹ćƒˆļ¼ˆć€Œćƒćƒ£ćƒ³ć‚Æć€ćØå‘¼ć³ć¾ć™ļ¼‰ćØćć®ćƒ”ć‚æćƒ‡ćƒ¼ć‚æļ¼ˆå¹“ć€ćƒ¬ćƒ¼ćƒ†ć‚£ćƒ³ć‚°ć€ć‚øćƒ£ćƒ³ćƒ«ćŖć©ļ¼‰ćØćØć‚‚ć«Milvusć«ęŒæå…„ć—ć¾ć™ć€‚ šŸ“„šŸ“Š

4.**ćƒ¦ćƒ¼ć‚¶ćƒ¼ć®ć‚Æć‚ØćƒŖć‚’å‡¦ē†ć™ć‚‹ļ¼šćƒ¦ćƒ¼ć‚¶ćƒ¼ć®ć‚Æć‚ØćƒŖć‚’åŒć˜åŸ‹ć‚č¾¼ćæćƒ¢ćƒ‡ćƒ«ć‚’ä½æć£ć¦ćƒ™ć‚Æćƒˆćƒ«ć«å¤‰ę›ć™ć‚‹ć€‚ę¬”ć«ć€čæ‘ä¼¼ęœ€čæ‘å‚ęŽ¢ē“¢ć‚’å®Ÿč”Œć—ć€ć‚Æć‚ØćƒŖćƒ»ćƒ™ć‚Æćƒˆćƒ«ć«ęœ€ć‚‚čæ‘ć„ćƒ‡ćƒ¼ć‚æćƒ»ćƒ™ć‚Æćƒˆćƒ«ć‚’č¦‹ć¤ć‘ć‚‹ć€‚šŸ”šŸŽ¬

å®Œå…ØćŖć‚³ćƒ¼ćƒ‰ćÆē§ć®GitHubć«ć‚ć‚Šć¾ć™ć€‚

ć¾ćšć€Milvusć«ęŽ„ē¶šć—ć¾ć™ć€‚Pymilvus悒pip-installć™ć‚‹åæ…č¦ćŒć‚ć‚Šć¾ć™ć€‚(ćƒ­ćƒ¼ć‚«ćƒ«ć®ćƒ•ć‚”ć‚¤ćƒ«åć ć‘ć‚’ęŒ‡å®šć™ć‚‹ć“ćØć§ć€ćƒ­ćƒ¼ć‚«ćƒ«ć®ćƒ™ć‚Æć‚æćƒ¼ćƒ‡ćƒ¼ć‚æćƒ™ćƒ¼ć‚¹ć§ć‚ć‚‹Milvus Liteを使用します。docker悄K8sćŒćƒ‡ćƒ—ćƒ­ć‚¤ć•ć‚Œć¦ć„ćŸć‚Šć€å®Œå…Øć«ē®”ē†ć•ć‚Œć¦ć„ć‚‹Zilliz Cloudなど、他のMilvusćŒć‚ć‚‹å “åˆćÆć€URIとTokenć‚’ęŒ‡å®šć—ć¦ęŽ„ē¶šć™ć‚‹ć“ćØćŒć§ćć¾ć™ć€‚ę®‹ć‚Šć®ć‚³ćƒ¼ćƒ‰ćÆåŒć˜ć‚ˆć†ć«å‹•ä½œć—ć¾ć™)怂

# !python -m pip install -U pymilvus
import pymilvus
# ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆć‚’Milvus Liteć‚µćƒ¼ćƒć«ęŽ„ē¶šć™ć‚‹ć€‚
from pymilvus import MilvusClient
ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆ = MilvusClient("milvus_demo.db")

ę¬”ć«ć€ę˜ ē”»ć®ćƒ¬ćƒ“ćƒ„ćƒ¼ć‚’å«ć‚€ćƒ†ć‚­ć‚¹ćƒˆć‚«ćƒ©ćƒ ć‚’ćƒćƒ£ćƒ³ć‚Æć—ć¦ćƒ™ć‚Æćƒˆćƒ«ć«åŸ‹ć‚č¾¼ć‚€ć€‚å¤šćć®ćƒŖć‚½ćƒ¼ć‚¹ćŒćć®ę–¹ę³•ć‚’ä¾‹ē¤ŗć—ć¦ć„ć‚‹ć®ć§ć€ć“ć“ć§ę”¹ć‚ć¦ć‚³ćƒ¼ćƒ‰ć‚’ē¤ŗć™ć“ćØćÆć—ćŖć„ć€‚ ä»„äø‹ć§ćÆć€ćƒćƒ£ćƒ³ć‚Æć•ć‚ŒćŸćƒ†ć‚­ć‚¹ćƒˆć€ćƒ™ć‚Æć‚æćƒ¼č”Øē¾ć€ćƒ”ć‚æćƒ‡ćƒ¼ć‚æć‚’ēµ„ćæē«‹ć¦ć€ćƒ‡ćƒ¼ć‚æć‚’Milvusć«ęŒæå…„ć™ć‚‹ę–¹ę³•ć‚’ē¤ŗć™ć€‚

# äø€ć¤ć®ćƒ«ćƒ¼ćƒ—ć§chunk_listとdict_listć‚’ä½œęˆć™ć‚‹ć€‚
dict_list = [].
for id, title, chunk, vector, poster_url, director, \
   genres, actors, keywords, film_year, rating in zip(
       df.id, df.Name, chunks, converted_values, df.PosterLink态
       df.ē›£ē£, df.ć‚øćƒ£ćƒ³ćƒ«, df.俳優, df.ć‚­ćƒ¼ćƒÆćƒ¼ćƒ‰ć€
       df.MovieYear态df.RatingValue):
  
   # åŸ‹ć‚č¾¼ćæćƒ™ć‚Æćƒˆćƒ«ć€å…ƒć®ćƒ†ć‚­ć‚¹ćƒˆćƒćƒ£ćƒ³ć‚Æć€ćƒ”ć‚æćƒ‡ćƒ¼ć‚æć‚’ēµ„ćæē«‹ć¦ć‚‹ć€‚
   chunk_dict = { {'movie_index': id
       'movie_index': id态
       'title': ć‚æć‚¤ćƒˆćƒ«ć€
       'chunk': chunk.page_content态
       'poster_url': poster_url态
       'director': ē›£ē£ć€
       'genres': ć‚øćƒ£ćƒ³ćƒ«ć€
       'actors': 俳優、
       'keywords': ć‚­ćƒ¼ćƒÆćƒ¼ćƒ‰
       'film_year': ćƒ•ć‚£ćƒ«ćƒ å¹“ć€
       'rating': ćƒ¬ćƒ¼ćƒ†ć‚£ćƒ³ć‚°
       'vector': vector态
   }
   dict_list.append(chunk_dict)

# ćƒ‡ćƒ¼ć‚æć‚’Milvusć‚³ćƒ¬ć‚Æć‚·ćƒ§ćƒ³ć«ęŒæå…„ć™ć‚‹ć€‚
print("ć‚Øćƒ³ćƒ†ć‚£ćƒ†ć‚£ć®ęŒæå…„ć‚’é–‹å§‹")
start_time = time.time()
client.insert(
   ć‚³ćƒ¬ć‚Æć‚·ćƒ§ćƒ³å
   data=dict_list态
   progress_bar=True)

end_time = time.time()
print(f "Milvus insert time for {len(dict_list)} vectors:", end="")
print(f"{np.round(end_time - start_time, 2)}ē§’")

ćƒ‡ćƒ¼ć‚æćŒMilvusć«å…„ć£ćŸć®ć§ć€ę¤œē“¢ć™ć‚‹ęŗ–å‚™ćŒć§ććŸļ¼

ę–‡å­—åˆ—ćƒ”ć‚æćƒ‡ćƒ¼ć‚æćƒ•ć‚£ćƒ«ć‚æć«ć‚ˆć‚‹ę¤œē“¢

ä¾‹ćˆć°ć€ćƒ­ćƒœćƒƒćƒˆćŒē™»å “ć™ć‚‹ćƒ‡ć‚£ć‚¹ćƒˆćƒ”ć‚¢ēš„ćŖęœŖę„ćŒęć‹ć‚Œć€č©•ä¾”ć®é«˜ć„SFę˜ ē”»ć‚’ę¤œē“¢ć—ćŸć„ćØć—ć¾ć™ć€‚ ć‚µćƒ³ćƒ—ćƒ«ćƒ‡ćƒ¼ć‚æćÆć“ć®ę¤œē“¢ć«ä½æćˆć‚‹ćƒ”ć‚æćƒ‡ćƒ¼ć‚æć‚’ęŒć£ć¦ć„ć¾ć™ć€‚

ä»„äø‹ćÆć€ćƒ•ć‚”ć‚øćƒ¼ćŖę–‡å­—åˆ—ćƒžćƒƒćƒć‚’ä½æć£ćŸćƒ”ć‚æćƒ‡ćƒ¼ć‚æć®ćƒ•ć‚£ćƒ«ć‚æćƒŖćƒ³ć‚°ć®ä¾‹ć§ć™ć€‚ä»„äø‹ć§ćÆć€vanilla Milvus search APIć®ćæć‚’ćƒ©ćƒƒćƒ—ć—ć¦ć€ę¤œē“¢å¾Œć«ćƒ”ć‚æćƒ‡ćƒ¼ć‚æć‚’č”Øē¤ŗć—ć‚„ć™ćć—ć¦ć„ć¾ć™ć€‚

SAMPLE_QUESTION = "ćƒ­ćƒœćƒƒćƒˆćŒå‡ŗć¦ćć‚‹ćƒ‡ć‚£ć‚¹ćƒˆćƒ”ć‚¢SF"
TOP_K = 1
# ćƒ”ć‚æćƒ‡ćƒ¼ć‚æć®ćƒ•ć‚£ćƒ«ć‚æćƒ¼
expression='rating >= 7'
# ć‚¤ćƒ³ćƒ•ć‚£ćƒƒć‚Æć‚¹ę–‡å­—åˆ—ćƒžćƒƒćƒć€‚
expression=expression + ' && title like "%Panther%"'.
formatted_results态context态context_metadata = \
     mc_run_search(SAMPLE_QUESTION, expression, TOP_K)

ćƒŖć‚½ćƒ¼ć‚¹ćØå‚č€ƒę–‡ēŒ®

Milvus ć‚Æć‚¤ćƒƒć‚Æć‚¹ć‚æćƒ¼ćƒˆć‚¬ć‚¤ćƒ‰

é…åˆ—ćƒ•ć‚£ćƒ¼ćƒ«ćƒ‰ć®ä½æē”Øļ½œMilvusćƒ‰ć‚­ćƒ„ćƒ”ćƒ³ćƒˆ

https://github.com/milvus-io/pymilvus/blob/2.4/examples/fuzzy_match.py

https://milvus.io/docs/boolean.md#Usage

https://milvus.io/docs/single-vector-search.md#Filtered-search

Updated on Jul 09, 2026