利用多向量和高級搜索數(shù)據(jù)模型設(shè)計城市數(shù)據(jù) 原創(chuàng)
本文介紹如何使用Milvus、GenAI、LangChain、YoLo等工具為向量數(shù)據(jù)庫創(chuàng)建、構(gòu)建和設(shè)計復(fù)雜的非結(jié)構(gòu)化數(shù)據(jù)應(yīng)用程序。
應(yīng)用程序的目標
本文將介紹如何構(gòu)建高級數(shù)據(jù)模型,并將其用于攝取和各種搜索選項。對于記事簿(Notebook)部分,將運行混合多向量搜索,對結(jié)果進行重新排序,并顯示結(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是一個高效的向量數(shù)據(jù)庫,專為高速相似度搜索和人工智能應(yīng)用而設(shè)計。在這一步中,使用標量和多個向量字段來優(yōu)化數(shù)據(jù)模型(一個用于文本,一個用于攝像頭圖像)。這同樣在streetcams.py應(yīng)用程序中進行。
- 在混合多模態(tài)、多向量搜索中使用開源模型進行數(shù)據(jù)查詢:了解如何使用標量和多個向量來查詢存儲在Milvus中的數(shù)據(jù),并在這個記事簿中重新排序最終結(jié)果。
- 顯示生成的文本和圖像:在這個記事簿中構(gòu)建用于驗證和檢查的快速輸出。
- 使用LangChain的簡單檢索增強生成(RAG):構(gòu)建一個簡單的Python RAG應(yīng)用程序?(streetcamrag.py),使用Milvus通過??Ollama??查詢當(dāng)前天氣。在輸出到屏幕上的同時,還將結(jié)果以Markdown格式發(fā)送到Slack。
總結(jié)
通過完成這個應(yīng)用程序,將全面了解使用Milvus、數(shù)據(jù)攝取對象半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù),以及使用開源模型構(gòu)建健壯高效的數(shù)據(jù)檢索系統(tǒng)。對于未來的功能改進,可以使用這些結(jié)果為??LLM??、Slack機器人將數(shù)據(jù)流傳輸?shù)紸pache Kafka中,以及作為街道攝像頭搜索引擎的基礎(chǔ)。
Milvus:為規(guī)模而構(gòu)建的開源向量數(shù)據(jù)庫
?Milvus是一個流行的開源向量數(shù)據(jù)庫,為應(yīng)用程序提供高性能和可擴展的向量相似性搜索。Milvus采用分布式架構(gòu),將計算和存儲分離,并將數(shù)據(jù)和工作負載分布在多個節(jié)點上。這是Milvus具有高可用性和彈性的主要原因之一。Milvus針對各種硬件進行了優(yōu)化,并支持大量索引。
可以在???Milvus快速入門??中獲得更多細節(jié)。
有關(guān)運行Milvus的其他選項,可以查看??部署頁面??。
紐約市511交通信息服務(wù)數(shù)據(jù)
- 紐約市街道攝像頭信息的REST Feed ,包括緯度、經(jīng)度、道路名稱、攝像頭名稱、攝像頭URL、禁用標志和阻止標志:
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端點獲取攝像頭圖像:
- 在通過??Ultralytics YOLO??運行之后,將得到這個攝像頭圖像的標記版本。
美國國家海洋和大氣管理局(NOAA)當(dāng)前天氣狀況
此外還攝取了一個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???腳本負責(zé)攝取、處理和豐富。
- 迭代REST調(diào)用的JSON結(jié)果,然后豐富、更新、運行Yolo predict,然后對提供的緯度和經(jīng)度運行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)
這兩個向量是image_vector和weather_text_vector,它們包含一個圖像向量和一個文本向量。為主鍵id和每個向量添加索引。對于這些索引有很多選擇,它們可以極大地提高性能。
將數(shù)據(jù)插入Milvus
然后使用與模式名稱和類型匹配的標量字段對集合進行簡單的插入操作。在插入之前,必須對圖像和天氣文本運行嵌入函數(shù)。然后插入記錄。再采用??Attu??檢查數(shù)據(jù)。
建立記事簿的報告
?將構(gòu)建一個Jupyter記事簿來查詢和報告多向量數(shù)據(jù)集。
為嵌入句子文本準備Hugging Face的句子轉(zhuǎn)換器
?利用Hugging Face的一個模型“all-MiniLM-L6-v2”,一個句子轉(zhuǎn)換器來為短文本字符串構(gòu)建密集嵌入。這篇文章是對離街頭攝像頭最近的地點的天氣細節(jié)的簡短描述。
參見:??使用HuggingFace整合??
為圖像準備嵌入模型
使用標準的resnet34 Pytorch特征提取器,經(jīng)常使用它來處理圖像。
實例化Milvus
?如前所述,Milvus是一個流行的開源向量數(shù)據(jù)庫,為人工智能應(yīng)用程序提供高性能和可擴展的向量相似性搜索。
- 在這個例子中,將連接到運行在Docker中的Milvus。
- 將URI設(shè)置為本地文件,例如/milvus.db是最方便的方法,因為它會自動利用Milvus Lite將所有數(shù)據(jù)存儲在該文件中。
- 如果有大量的數(shù)據(jù)(例如超過一百萬個向量),可以在Docker或Kubernetes上設(shè)置一個性能更高的Milvus服務(wù)器。在這一設(shè)置中,可以使用服務(wù)器URI,例如http://localhost:19530作為URI。
- 如果想使用Zilliz Cloud (Milvus的完全托管云服務(wù)),可以調(diào)整URI和令牌,它們對應(yīng)于Zilliz Cloud中的公共端點和API密鑰。?
準備搜索
建立兩個搜索(AnnSearchRequest),將其組合在一起進行混合搜索,其中將包括一個重排器(Reranker)。
顯示結(jié)果
?這里顯示了對兩個向量重新排序的混合搜索結(jié)果,展示了一些輸出標量字段和從存儲路徑讀取的圖像。
混合搜索的結(jié)果可以迭代,可以很容易地訪問選擇的所有輸出字段。filepath包含到本地存儲映像的鏈接,可以從key.entity.filepath訪問。鍵包含所有的結(jié)果,而key.entity擁有在上一步混合搜索中選擇的所有輸出字段。
迭代重新排序的結(jié)果,并顯示圖像和天氣細節(jié)。?
RAG應(yīng)用程序
?由于已經(jīng)加載了一個包含天氣數(shù)據(jù)的集合,可以將其用作RAG(檢索增強生成)的一部分。將利用本地的Ollama、LangChain和Milvus構(gòu)建一個完全開源的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 )
- 提示互動問題。
Python
1 query = input("\nQuery: ")
- 在LLM和vector store之間建立了一個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é)論
?在這個記事簿中,已經(jīng)了解如何使用Milvus對同一集合中的多個向量進行混合搜索,并對結(jié)果進行重新排序。還看到了如何構(gòu)建一個復(fù)雜的數(shù)據(jù)模態(tài),其中包含多個向量和許多標量字段,這些字段表示與數(shù)據(jù)相關(guān)的大量元數(shù)據(jù)。
學(xué)習(xí)了如何使用Python將JSON、圖像和文本攝取到Milvus中。
最后,構(gòu)建了一個小型聊天應(yīng)用程序,用于查看交通攝像頭附近位置的天氣。
用戶如果構(gòu)建自己的應(yīng)用程序,可以查看下面的參考資料。?
資源
在下面的列表中,可以找到有助于了解更多關(guān)于為Milvus使用預(yù)訓(xùn)練的嵌入模型、對文本數(shù)據(jù)進行搜索的資源,以及一個很好的嵌入函數(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???
原文標題:??Utilizing Multiple Vectors and Advanced Search Data Model Design for City Data??,作者:Tim Spann,Timothy Spann
