发布时间:2025-11-04 00:11:54 来源:云智核 作者:人工智能

译者 | 李睿
审校 | 重楼
本文介绍如何使用Milvus、利用量和GenAI、高级LangChain、搜索数据设计数据YoLo等工具为向量数据库创建、模型构建和设计复杂的城市非结构化数据应用程序。
本文将介绍如何构建高级数据模型,并将其用于摄取和各种搜索选项。高级对于记事簿(Notebook)部分,搜索数据设计数据将运行混合多向量搜索,模型对结果进行重新排序,城市并显示结果文本和图像。利用量和

通过完成这个应用程序,将全面了解使用Milvus、数据摄取对象半结构化和非结构化数据,以及使用开源模型构建健壮高效的数据检索系统。对于未来的功能改进,可以使用这些结果为LLM、Slack机器人将数据流传输到Apache Kafka中,以及作为街道摄像头搜索引擎的基础。
Milvus是一个流行的开源向量数据库,为应用程序提供高性能和可扩展的向量相似性搜索。Milvus采用分布式架构,将计算和存储分离,并将数据和工作负载分布在多个节点上。这是Milvus具有高可用性和弹性的主要原因之一。Milvus针对各种硬件进行了优化,并支持大量索引。
可以在Milvus快速入门中获得更多细节。云服务器提供商
有关运行Milvus的其他选项,可以查看部署页面。

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}1.2.3.4.5.6.7.8. 然后,从摄像头图像的URL端点获取摄像头图像:

此外还摄取了一个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 }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24. 摄入和富集将在Python加载脚本中从NY REST提要中摄取数据。在streetcams.py应用程序中,Python脚本负责摄取、处理和丰富。迭代REST调用的JSON结果,然后丰富、更新、b2b供应网运行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)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.这两个向量是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(检索增强生成)的一部分。将利用本地的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 )1.2.3.4.5.6.7.8. 然后连接到Ollama。Python
复制1llm = Ollama( 2 model="llama3", 3 callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]), 4 stop=["<|eot_id|>"], 5 )1.2.3.4.5.6. 提示互动问题。Python
复制1 query = input("\nQuery: ")1. 在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"])1.2.3.4.5. 然后将结果发布到Slack通道。Python
复制1 response = client.chat_postMessage(channel="C06NE1FU6SE", text="", 2 blocks=[{"type": "section", 3 "text": {"type": "mrkdwn", 4 "text": str(query) + 5 " nn"}}, 6 {"type": "divider"}, 7 {"type": "section","text": 8 {"type": "mrkdwn","text": 9 str(resultforslack) +"n"}}]1.2.3.4.5.6.7.8.9.以下是与Slack聊天的输出。

可以在下面的GitHub中找到记事簿、摄取脚本和交互式RAG应用程序的所有源代码。
源代码在这个记事簿中,已经了解如何使用Milvus对同一集合中的多个向量进行混合搜索,并对结果进行重新排序。还看到了如何构建一个复杂的数据模态,其中包含多个向量和许多标量字段,这些字段表示与数据相关的大量元数据。
学习了如何使用Python将JSON、图像和文本摄取到Milvus中。
最后,构建了一个小型聊天应用程序,用于查看交通摄像头附近位置的天气。
用户如果构建自己的应用程序,可以查看下面的参考资料。
在下面的列表中,可以找到有助于了解更多关于为Milvus使用预训练的嵌入模型、对文本数据进行搜索的资源,以及一个很好的嵌入函数示例记事簿。
Milvus RerankingMilvus Hybrid Search511NY: GET api/GetCamerasUsing PyMilvuss Model To Generate Text EmbeddingsHuggingFace: sentence-transformers/all-MiniLM-L6-v2Pretrained ModelsMilvus: SentenceTransformerEmbeddingFunctionVectorizing JSON Data with Milvus for Similarity SearchMilvus: Scalar IndexMilvus: In-memory IndexMilvus: On-disk IndexGPU IndexNot Every Field is Just Text, Numbers, or VectorsHow good is Quantization in Milvus?原文标题:Utilizing Multiple Vectors and Advanced Search Data Model Design for City Data,作者:Tim Spann,Timothy Spann