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