譯者 | 李睿
審校 | 重樓
本文介紹如何使用Milvus、GenAI、LangChain、YoLo等工具為向量數(shù)據(jù)庫創(chuàng)建、構(gòu)建和設(shè)計(jì)復(fù)雜的非結(jié)構(gòu)化數(shù)據(jù)應(yīng)用程序。
應(yīng)用程序的目標(biāo)
本文將介紹如何構(gòu)建高級數(shù)據(jù)模型,并將其用于攝取和各種搜索選項(xiàng)。對于記事簿(Notebook)部分,將運(yùn)行混合多向量搜索,對結(jié)果進(jìn)行重新排序,并顯示結(jié)果文本和圖像。
- 攝取數(shù)據(jù)字段,通過查找和格式化來豐富數(shù)據(jù):學(xué)習(xí)攝取包括JSON和圖像在內(nèi)的數(shù)據(jù),格式化和轉(zhuǎn)換以優(yōu)化混合搜索。這一過程在streetcams.py應(yīng)用程序中完成。
- 將數(shù)據(jù)存儲到Milvus:學(xué)習(xí)如何將數(shù)據(jù)存儲到Milvus中,Milvus是一個(gè)高效的向量數(shù)據(jù)庫,專為高速相似度搜索和人工智能應(yīng)用而設(shè)計(jì)。在這一步中,使用標(biāo)量和多個(gè)向量字段來優(yōu)化數(shù)據(jù)模型(一個(gè)用于文本,一個(gè)用于攝像頭圖像)。這同樣在streetcams.py應(yīng)用程序中進(jìn)行。
- 在混合多模態(tài)、多向量搜索中使用開源模型進(jìn)行數(shù)據(jù)查詢:了解如何使用標(biāo)量和多個(gè)向量來查詢存儲在Milvus中的數(shù)據(jù),并在這個(gè)記事簿中重新排序最終結(jié)果。
- 顯示生成的文本和圖像:在這個(gè)記事簿中構(gòu)建用于驗(yàn)證和檢查的快速輸出。
- 使用LangChain的簡單檢索增強(qiáng)生成(RAG):構(gòu)建一個(gè)簡單的Python RAG應(yīng)用程序(streetcamrag.py),使用Milvus通過Ollama查詢當(dāng)前天氣。在輸出到屏幕上的同時(shí),還將結(jié)果以Markdown格式發(fā)送到Slack。
總結(jié)
通過完成這個(gè)應(yīng)用程序,將全面了解使用Milvus、數(shù)據(jù)攝取對象半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù),以及使用開源模型構(gòu)建健壯高效的數(shù)據(jù)檢索系統(tǒng)。對于未來的功能改進(jìn),可以使用這些結(jié)果為LLM、Slack機(jī)器人將數(shù)據(jù)流傳輸?shù)紸pache Kafka中,以及作為街道攝像頭搜索引擎的基礎(chǔ)。
Milvus:為規(guī)模而構(gòu)建的開源向量數(shù)據(jù)庫
Milvus是一個(gè)流行的開源向量數(shù)據(jù)庫,為應(yīng)用程序提供高性能和可擴(kuò)展的向量相似性搜索。Milvus采用分布式架構(gòu),將計(jì)算和存儲分離,并將數(shù)據(jù)和工作負(fù)載分布在多個(gè)節(jié)點(diǎn)上。這是Milvus具有高可用性和彈性的主要原因之一。Milvus針對各種硬件進(jìn)行了優(yōu)化,并支持大量索引。
可以在Milvus快速入門中獲得更多細(xì)節(jié)。
有關(guān)運(yùn)行Milvus的其他選項(xiàng),可以查看部署頁面。
紐約市511交通信息服務(wù)數(shù)據(jù)
- 紐約市街道攝像頭信息的REST Feed ,包括緯度、經(jīng)度、道路名稱、攝像頭名稱、攝像頭URL、禁用標(biāo)志和阻止標(biāo)志:
JSON
1 {
2 "Latitude": 43.004452, "Longitude": -78.947479, "ID": "NYSDOT-badsfsfs3",
3 "Name": "I-190 at Interchange 18B", "DirectionOfTravel": "Unknown",
4 "RoadwayName": "I-190 Niagara Thruway",
5 "Url": "https://nyimageurl",
6 "VideoUrl": "https://camera:443/rtplive/dfdf/playlist.m3u8",
7 "Disabled":true, "Blocked":false
8}
- 然后,從攝像頭圖像的URL端點(diǎn)獲取攝像頭圖像:
- 在通過Ultralytics YOLO運(yùn)行之后,將得到這個(gè)攝像頭圖像的標(biāo)記版本。
美國國家海洋和大氣管理局(NOAA)當(dāng)前天氣狀況
此外還攝取了一個(gè)REST提要,用于滿足從攝像頭記錄中傳入的緯度和經(jīng)度的天氣條件,其中包括海拔、觀測日期、風(fēng)速、風(fēng)向、能見度、相對濕度和溫度等參數(shù)。
JSON
1
2 "currentobservation":{
3 "id":"KLGA",
4 "name":"New York, La Guardia Airport",
5 "elev":"20",
6 "latitude":"40.78",
7 "longitude":"-73.88",
8 "Date":"27 Aug 16:51 pm EDT",
9 "Temp":"83",
10 "Dewp":"60",
11 "Relh":"46",
12 "Winds":"14",
13 "Windd":"150",
14 "Gust":"NA",
15 "Weather":"Partly Cloudy",
16 "Weatherimage":"sct.png",
17 "Visibility":"10.00",
18 "Altimeter":"1017.1",
19 "SLP":"30.04",
20 "timezone":"EDT",
21 "state":"NY",
22
"WindChill":"NA"
23 }
攝入和富集
- 將在Python加載腳本中從NY REST提要中攝取數(shù)據(jù)。
- 在streetcams.py應(yīng)用程序中,Python腳本負(fù)責(zé)攝取、處理和豐富。
- 迭代REST調(diào)用的JSON結(jié)果,然后豐富、更新、運(yùn)行Yolo predict,然后對提供的緯度和經(jīng)度運(yùn)行NOAA天氣查詢。
構(gòu)建Milvus數(shù)據(jù)模式
- 在這里將把集合命名為“nycstreetcameras”。
- 為元數(shù)據(jù)、主鍵和向量添加字段。
- 此外,還有很多varchar變量,例如roadwayname、county和weathername。
Python
FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=True),
2 FieldSchema(name='latitude', dtype=DataType.VARCHAR, max_length=200),
3 FieldSchema(name='longitude', dtype=DataType.VARCHAR, max_length=200),
4 FieldSchema(name='name', dtype=DataType.VARCHAR, max_length=200),
5 FieldSchema(name='roadwayname', dtype=DataType.VARCHAR, max_length=200),
6 FieldSchema(name='directionoftravel', dtype=DataType.VARCHAR, max_length=200),
7 FieldSchema(name='videourl', dtype=DataType.VARCHAR, max_length=200),
8 FieldSchema(name='url', dtype=DataType.VARCHAR, max_length=200),
9 FieldSchema(name='filepath', dtype=DataType.VARCHAR, max_length=200),
10 FieldSchema(name='creationdate', dtype=DataType.VARCHAR, max_length=200),
11 FieldSchema(name='areadescription', dtype=DataType.VARCHAR, max_length=200),
12 FieldSchema(name='elevation', dtype=DataType.VARCHAR, max_length=200),
13 FieldSchema(name='county', dtype=DataType.VARCHAR, max_length=200),
14 FieldSchema(name='metar', dtype=DataType.VARCHAR, max_length=200),
15 FieldSchema(name='weatherid', dtype=DataType.VARCHAR, max_length=200),
16 FieldSchema(name='weathername', dtype=DataType.VARCHAR, max_length=200),
17 FieldSchema(name='observationdate', dtype=DataType.VARCHAR, max_length=200),
18 FieldSchema(name='temperature', dtype=DataType.FLOAT),
19 FieldSchema(name='dewpoint', dtype=DataType.VARCHAR, max_length=200),
20 FieldSchema(name='relativehumidity', dtype=DataType.VARCHAR, max_length=200),
21 FieldSchema(name='windspeed', dtype=DataType.VARCHAR, max_length=200),
22 FieldSchema(name='winddirection', dtype=DataType.VARCHAR, max_length=200),
23 FieldSchema(name='gust', dtype=DataType.VARCHAR, max_length=200),
24 FieldSchema(name='weather', dtype=DataType.VARCHAR, max_length=200),
25 FieldSchema(name='visibility', dtype=DataType.VARCHAR, max_length=200),
26 FieldSchema(name='altimeter', dtype=DataType.VARCHAR, max_length=200),
27 FieldSchema(name='slp', dtype=DataType.VARCHAR, max_length=200),
28 FieldSchema(name='timezone', dtype=DataType.VARCHAR, max_length=200),
29 FieldSchema(name='state', dtype=DataType.VARCHAR, max_length=200),
30 FieldSchema(name='windchill', dtype=DataType.VARCHAR, max_length=200),
31 FieldSchema(name='weatherdetails', dtype=DataType.VARCHAR, max_length=8000),
32 FieldSchema(name='image_vector', dtype=DataType.FLOAT_VECTOR, dim=512),
33 FieldSchema(name='weather_text_vector', dtype=DataType.FLOAT_VECTOR, dim=384)
這兩個(gè)向量是image_vector和weather_text_vector,它們包含一個(gè)圖像向量和一個(gè)文本向量。為主鍵id和每個(gè)向量添加索引。對于這些索引有很多選擇,它們可以極大地提高性能。
將數(shù)據(jù)插入Milvus
然后使用與模式名稱和類型匹配的標(biāo)量字段對集合進(jìn)行簡單的插入操作。在插入之前,必須對圖像和天氣文本運(yùn)行嵌入函數(shù)。然后插入記錄。再采用Attu檢查數(shù)據(jù)。
建立記事簿的報(bào)告
將構(gòu)建一個(gè)Jupyter記事簿來查詢和報(bào)告多向量數(shù)據(jù)集。
為嵌入句子文本準(zhǔn)備Hugging Face的句子轉(zhuǎn)換器
利用Hugging Face的一個(gè)模型“all-MiniLM-L6-v2”,一個(gè)句子轉(zhuǎn)換器來為短文本字符串構(gòu)建密集嵌入。這篇文章是對離街頭攝像頭最近的地點(diǎn)的天氣細(xì)節(jié)的簡短描述。
為圖像準(zhǔn)備嵌入模型
使用標(biāo)準(zhǔn)的resnet34 Pytorch特征提取器,經(jīng)常使用它來處理圖像。
實(shí)例化Milvus
如前所述,Milvus是一個(gè)流行的開源向量數(shù)據(jù)庫,為人工智能應(yīng)用程序提供高性能和可擴(kuò)展的向量相似性搜索。
- 在這個(gè)例子中,將連接到運(yùn)行在Docker中的Milvus。
- 將URI設(shè)置為本地文件,例如/milvus.db是最方便的方法,因?yàn)樗鼤詣?dòng)利用Milvus Lite將所有數(shù)據(jù)存儲在該文件中。
- 如果有大量的數(shù)據(jù)(例如超過一百萬個(gè)向量),可以在Docker或Kubernetes上設(shè)置一個(gè)性能更高的Milvus服務(wù)器。在這一設(shè)置中,可以使用服務(wù)器URI,例如http://localhost:19530作為URI。
- 如果想使用Zilliz Cloud (Milvus的完全托管云服務(wù)),可以調(diào)整URI和令牌,它們對應(yīng)于Zilliz Cloud中的公共端點(diǎn)和API密鑰。
準(zhǔn)備搜索
建立兩個(gè)搜索(AnnSearchRequest),將其組合在一起進(jìn)行混合搜索,其中將包括一個(gè)重排器(Reranker)。
顯示結(jié)果
這里顯示了對兩個(gè)向量重新排序的混合搜索結(jié)果,展示了一些輸出標(biāo)量字段和從存儲路徑讀取的圖像。
混合搜索的結(jié)果可以迭代,可以很容易地訪問選擇的所有輸出字段。filepath包含到本地存儲映像的鏈接,可以從key.entity.filepath訪問。鍵包含所有的結(jié)果,而key.entity擁有在上一步混合搜索中選擇的所有輸出字段。
迭代重新排序的結(jié)果,并顯示圖像和天氣細(xì)節(jié)。
RAG應(yīng)用程序
由于已經(jīng)加載了一個(gè)包含天氣數(shù)據(jù)的集合,可以將其用作RAG(檢索增強(qiáng)生成)的一部分。將利用本地的Ollama、LangChain和Milvus構(gòu)建一個(gè)完全開源的RAG應(yīng)用程序。
- 采用集合將vector_store設(shè)置為Milvus。
Python
1 vector_store = Milvus(
2 embedding_function=embeddings,
3 collection_name="CollectionName",
4 primary_field = "id",
5 vector_field = "weather_text_vector",
6 text_field="weatherdetails",
7 connection_args={"uri": "https://localhost:19530"},
8 )
- 然后連接到Ollama。
Python
1llm = Ollama(
2 model="llama3",
3
callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]),
4 stop=["<|eot_id|>"],
5 )
- 提示互動(dòng)問題。
Python
1 query = input("\nQuery: ")
- 在LLM和vector store之間建立了一個(gè)RetrievalQA連接。傳入查詢并獲得結(jié)果。
Python
1 qa_chain = RetrievalQA.from_chain_type(
2 llm, retriever=vector_store.as_retriever(collection = SC_COLLECTION_NAME))
3
4 result = qa_chain({"query": query})
5 resultforslack = str(result["result"])
- 然后將結(jié)果發(fā)布到Slack通道。
Python
1 response = client.chat_postMessage(channel="C06NE1FU6SE", text="",
2 blocks=[{"type": "section",
3 "text": {"type": "mrkdwn",
4 "text": str(query) +
5 " \n\n" }},
6 {"type": "divider"},
7 {"type": "section","text":
8 {"type": "mrkdwn","text":
9 str(resultforslack) +"\n" }}]
以下是與Slack聊天的輸出。
可以在下面的GitHub中找到記事簿、攝取腳本和交互式RAG應(yīng)用程序的所有源代碼。
結(jié)論
在這個(gè)記事簿中,已經(jīng)了解如何使用Milvus對同一集合中的多個(gè)向量進(jìn)行混合搜索,并對結(jié)果進(jìn)行重新排序。還看到了如何構(gòu)建一個(gè)復(fù)雜的數(shù)據(jù)模態(tài),其中包含多個(gè)向量和許多標(biāo)量字段,這些字段表示與數(shù)據(jù)相關(guān)的大量元數(shù)據(jù)。
學(xué)習(xí)了如何使用Python將JSON、圖像和文本攝取到Milvus中。
最后,構(gòu)建了一個(gè)小型聊天應(yīng)用程序,用于查看交通攝像頭附近位置的天氣。
用戶如果構(gòu)建自己的應(yīng)用程序,可以查看下面的參考資料。
資源
在下面的列表中,可以找到有助于了解更多關(guān)于為Milvus使用預(yù)訓(xùn)練的嵌入模型、對文本數(shù)據(jù)進(jìn)行搜索的資源,以及一個(gè)很好的嵌入函數(shù)示例記事簿。
- Milvus Reranking
- Milvus Hybrid Search
- 511NY: GET api/GetCameras
- Using PyMilvus's Model To Generate Text Embeddings
- HuggingFace: sentence-transformers/all-MiniLM-L6-v2
- Pretrained Models
- Milvus: SentenceTransformerEmbeddingFunction
- Vectorizing JSON Data with Milvus for Similarity Search
- Milvus: Scalar Index
- Milvus: In-memory Index
- Milvus: On-disk Index
- GPU Index
- Not Every Field is Just Text, Numbers, or Vectors
- How good is Quantization in Milvus?
原文標(biāo)題:Utilizing Multiple Vectors and Advanced Search Data Model Design for City Data,作者:Tim Spann,Timothy Spann