译者 | 李睿
审校 | 重楼
本文介绍如何使用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”,一个句子转换器来为短文本字符串构建密集嵌入。这篇文章是对离街头摄像头最近的地点的天气细节的简短描述。
为图像准备嵌入模型
使用标准的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