从零搭建AI日记本:Milvus向量数据库实战指南
当AI Agent有了“记忆”它就不再是简单的对话工具而成为了一个懂你的伙伴。最近我在开发一个AI日记本应用发现传统的MySQL很难实现“语义搜索”——比如你想找“心情愉快的日子”但日记里并没有这个词。这时向量数据库就派上了用场。本文我将分享如何使用Milvus以及全托管服务Zilliz结合OpenAI Embeddings快速构建一个具备记忆与检索能力的AI日记助手。一、为什么需要向量数据库我们熟悉的MySQL、PostgreSQL擅长存储结构化数据通过id或LIKE进行精确或模糊匹配。但AI应用中的数据往往是非结构化的——文本、图像、音频。当我们希望根据语义来检索时比如“查找关于户外活动的日记”传统数据库就力不从心了。向量数据库应运而生。它将数据转换成高维向量通过计算向量间的距离余弦相似度、欧氏距离等来实现语义相似性检索。像Milvus这样的系统专为海量高维向量设计已经成为AI Agent记忆系统的标配。如果说MySQL是结构化数据的仓库那Milvus就是向量数据的图书馆——你不再需要记住书名关键词只需描述你想看的内容它就能帮你找到“懂你”的那本书。二、Milvus与Zilliz你的向量数据库选择Milvus开源向量数据库支持十亿级向量检索提供多种索引IVF_FLAT、HNSW等底层用C实现性能强悍。Zilliz基于Milvus的全托管云服务免运维提供API Key接入适合快速开发和线上部署。本文使用Zilliz免费版省去自建集群的繁琐。注册后你会获得一个ADDRESS如https://xxxx.zillizcloud.com和TOKEN填入.env即可。三、环境准备npm install zilliz/milvus2-sdk-node langchain/openai dotenv创建.env文件MILVUS_ADDRESShttps://your-instance.zillizcloud.com MILVUS_TOKENyour-api-token OPENAI_API_KEYsk-xxx OPENAI_BASE_URLhttps://api.openai.com/v1 # 或代理地址 EMBEDDINGS_MODEL_NAMEtext-embedding-3-small MODEL_NAMEgpt-4o-mini四、初次接触连接与基础操作我们先写一个简单脚本连接Zilliz创建集合插入两条测试向量并执行一次搜索。4.1 连接与健康检查import { MilvusClient, IndexType, MetricType } from zilliz/milvus2-sdk-node; import dotenv/config; const client new MilvusClient({ address: process.env.MILVUS_ADDRESS, token: process.env.MILVUS_TOKEN, }); const check await client.checkHealth(); if (!check.isHealthy) throw new Error(连接失败);4.2 创建集合Collection在Milvus中集合相当于MySQL的表。我们定义一个4维向量字段仅为演示自动生成ID。const COLLECTION_NAME test; const DIMENSION 4; await client.createCollection({ collection_name: COLLECTION_NAME, dimension: DIMENSION, auto_id: true, });4.3 创建索引——让查询快如闪电没有索引的向量检索是全量遍历O(n)数据量一大就慢得无法接受。索引好比书的目录能大幅缩小搜索范围。await client.createIndex({ collection_name: COLLECTION_NAME, field_name: vector, index_type: IndexType.AUTOINDEX, // 自动选择最优索引 metric_type: MetricType.COSINE, // 相似度度量 });AUTOINDEX是Milvus 2.3提供的智能索引会基于数据自动调整新手友好。生产环境可根据数据量选用IVF_FLAT、HNSW等。4.4 插入数据Milvus的数据插入非常灵活直接传入JSON数组即可无需写SQL。const data [ { vector: [0.1, 0.2, 0.3, 0.4], content: 今天天气真好 }, { vector: [0.5, 0.6, 0.7, 0.8], content: 完成了一个大项目 }, ]; await client.insert({ collection_name: COLLECTION_NAME, data });4.5 执行向量搜索const searchRes await client.search({ collection_name: COLLECTION_NAME, data: [[0.5, 0.5, 0.6, 0.8]], // 查询向量 limit: 2, output_fields: [content], }); console.log(searchRes.results);你会得到按相似度排序的结果并附带score得分越接近1表示越相似。五、进阶AI日记本的核心——文本向量化上面的例子用的是手工构造的向量现实中我们需要将文本转换为向量。这通常由Embedding模型完成如OpenAI的text-embedding-3-small。5.1 定义集合结构带丰富元数据我们的日记不仅有内容还有日期、心情、标签等结构化字段。Milvus支持多种数据类型我们定义一个更完整的schemaconst COLLECTION_NAME ai_dairy; const VECTOR_DIM 1024; // 与embedding模型维度一致 await client.createCollection({ collection_name: COLLECTION_NAME, fields: [ { name: id, data_type: DataType.VarChar, max_length: 50, is_primary_key: true }, { name: vector, data_type: DataType.FloatVector, dim: VECTOR_DIM }, { name: content, data_type: DataType.VarChar, max_length: 5000 }, { name: date, data_type: DataType.VarChar, max_length: 50 }, { name: mood, data_type: DataType.VarChar, max_length: 50 }, { name: tags, data_type: DataType.Array, element_type: DataType.VarChar, max_capacity: 10, max_length: 50 }, ] });这里用到了Array类型来存储标签非常方便。5.2 使用LangChain生成Embeddingimport { OpenAIEmbeddings } from langchain/openai; const embeddings new OpenAIEmbeddings({ apiKey: process.env.OPENAI_API_KEY, model: process.env.EMBEDDINGS_MODEL_NAME, dimensions: VECTOR_DIM, }); async function getEmbedding(text) { return await embeddings.embedQuery(text); }5.3 插入带有向量的日记假设我们有5条日记内容我们遍历每条调用getEmbedding生成向量然后批量插入。const diaryData await Promise.all( diaryContents.map(async (diary) ({ ...diary, vector: await getEmbedding(diary.content), })) ); await client.insert({ collection_name: COLLECTION_NAME, data: diaryData });注意插入前需要先loadCollection将集合加载到内存否则搜索会报错。await client.loadCollection({ collection_name: COLLECTION_NAME });六、语义搜索用自然语言找日记现在用户输入“我想看看关于户外活动的日记”我们先将问题向量化然后去Milvus中搜索。const query 我想看看关于户外活动的日记; const queryVector await getEmbedding(query); const result await client.search({ collection_name: COLLECTION_NAME, vector: queryVector, limit: 2, metric_type: MetricType.COSINE, output_fields: [id, content, date, mood, tags] });输出的结果会包含相似度得分并且按得分降序排列。你可能会发现即使日记中没有“户外”二字只要内容提到“爬山”、“散步”等也会被检索出来——这就是语义检索的魅力。七、RAG让大模型结合记忆来回答RAG检索增强生成是目前AI应用的主流范式。我们检索出相关的日记然后作为上下文喂给大模型让它生成一个既基于事实又有人情味的回答。7.1 检索相关日记封装一个函数async function retrieveRelevantDiaries(question, k 2) { const vec await getEmbedding(question); const res await client.search({ collection_name: COLLECTION_NAME, vector: vec, limit: k, output_fields: [id, content, date, mood, tags] }); return res.results; }7.2 构建Prompt与调用LLMimport { ChatOpenAI } from langchain/openai; const model new ChatOpenAI({ temperature: 0.1, model: process.env.MODEL_NAME, }); async function answerDiaryQuestion(question) { const diaries await retrieveRelevantDiaries(question, 2); if (!diaries.length) return 没有找到相关日记; const context diaries.map((d, i) [日记${i1}] 日期:${d.date} 心情:${d.mood} 内容:${d.content} ).join(\n\n); const prompt 你是一个温暖的AI日记助手。根据以下日记内容回答用户问题 ${context} 用户问题${question} 要求 - 如果日记中有相关信息请结合给出详细回答。 - 用“你”称呼日记作者语气亲切。 - 如果信息不足请温和地说明。 回答 ; const response await model.invoke(prompt); console.log(response.content); }7.3 效果演示当用户问“我最近做了什么让我感到快乐的事情”时系统会检索出得分最高的日记比如“完成项目里程碑”和“散步赏花”然后大模型会总结出这些快乐时刻并给予温暖的回应。这时候AI不再是一个冷冰冰的问答机而是真正“读过”你的日记成为了懂你的朋友。八、踩坑与优化建议索引创建时机最好在插入数据前创建索引否则插入后需手动构建。loadCollection每次操作前确保集合已加载否则搜索报错。维度一致向量维度必须与Embedding模型输出维度一致否则插入失败。批量插入插入大量数据时分批进行每批几百条避免超时。连接管理使用client.connectPromise确保连接完成再操作SDK 2.x版本。相似度度量COSINE适合文本IP内积和L2也有各自适用场景根据数据特点选择。九、总结与展望通过本文你已经掌握了向量数据库的核心概念与Milvus基本操作如何结合Embedding模型将文本向量化如何实现语义搜索和RAG问答我们构建的AI日记本只是一个起点同样的架构可以应用到客服知识库、推荐系统、AI Agent记忆系统等众多场景。当AI拥有了“长期记忆”它的能力边界将被大大拓展。最后送大家一句心得“数据决定智能的上限向量数据库就是承载这些数据的骨骼。”愿你的AI应用都能拥有聪明而持久的记忆。

相关新闻

Vue3核心特性与Composition API实战指南

Vue3核心特性与Composition API实战指南

1. Vue3核心特性与设计哲学Vue3作为当前主流前端框架的里程碑版本,其核心设计围绕"更小、更快、更强"的理念展开。与Vue2相比,Vue3在性能优化方面实现了显著突破:打包体积减少41%、初次渲染快55%、更新快133%。这些提升主要得益于全…

2026/7/28 4:02:07 阅读更多 →
基于HSV颜色空间与串口通信的Micro:bit实时视觉点阵显示项目实践

基于HSV颜色空间与串口通信的Micro:bit实时视觉点阵显示项目实践

1. 项目概述:从视频到点阵的实时视觉魔法如果你手头有一块Micro:bit,并且已经玩腻了内置的5x5 LED点阵,想要让它显示更丰富、更动态的内容,比如实时显示摄像头捕捉到的图像轮廓,那么这个项目就是为你准备的。这次我们不…

2026/7/28 4:01:07 阅读更多 →
[Android] Netmonitor -高级版+基站网络实时监测工具

[Android] Netmonitor -高级版+基站网络实时监测工具

[Android] Netmonitor -高级版基站网络实时监测工具 链接:https://pan.xunlei.com/s/VOyXgd1aIiO3fWMVNkK0ff8SA1?pwdmbpy# 支持4G、5G与WiFi网络监测,实时查看网络速度与连接状态,精准检测信号强弱区域,自动标注周边基站位置…

2026/7/28 4:01:07 阅读更多 →

最新新闻

Unity外观模式实战:简化复杂系统调用,提升代码可维护性

Unity外观模式实战:简化复杂系统调用,提升代码可维护性

1. 项目概述:为什么Unity开发者需要关注外观模式?在Unity项目开发的中后期,尤其是当你的游戏从一个简单的Demo演变成一个包含复杂系统的完整产品时,你可能会遇到这样的场景:你的游戏启动流程需要依次初始化资源管理器、…

2026/7/28 4:14:11 阅读更多 →
终极开源音乐流媒体指南:Spotube如何重新定义你的音乐体验?

终极开源音乐流媒体指南:Spotube如何重新定义你的音乐体验?

终极开源音乐流媒体指南:Spotube如何重新定义你的音乐体验? 【免费下载链接】spotube 🎧 Open source music streaming app! Available for both desktop & mobile! 项目地址: https://gitcode.com/GitHub_Trending/sp/spotube 你…

2026/7/28 4:14:11 阅读更多 →
树莓派Pico 2 RISC-V双核开发实战:从ARM迁移到性能飞跃

树莓派Pico 2 RISC-V双核开发实战:从ARM迁移到性能飞跃

1. 项目概述:当树莓派拥抱RISC-V最近,树莓派基金会发布的新品Raspberry Pi Pico 2,在创客圈和嵌入式开发者中激起了不小的波澜。核心原因很简单:它不再是那个我们熟悉的、基于ARM Cortex-M0的Pico了。这次,Pico 2的核心…

2026/7/28 4:14:11 阅读更多 →
如何高效使用LangChain SQLDatabaseChain:5个实战技巧与深度解析

如何高效使用LangChain SQLDatabaseChain:5个实战技巧与深度解析

如何高效使用LangChain SQLDatabaseChain:5个实战技巧与深度解析 【免费下载链接】langchain The agent engineering platform. 项目地址: https://gitcode.com/GitHub_Trending/la/langchain LangChain SQLDatabaseChain是LangChain项目中一个革命性的自然语…

2026/7/28 4:14:11 阅读更多 →
从零构建模型火箭垂直着陆系统:PID控制、传感器融合与嵌入式飞控实践

从零构建模型火箭垂直着陆系统:PID控制、传感器融合与嵌入式飞控实践

1. 项目概述:当“玩具”遇上“硬核”航天看到这个标题,你可能会心一笑:模型火箭、纸板自动售货机,听起来像是孩子的手工课作业。但如果你仔细琢磨一下“完成类似 SpaceX 的垂直着陆”这个定语,事情就变得有趣起来了。这…

2026/7/28 4:14:11 阅读更多 →
如何在Windows 10/11上复活经典游戏:dxwrapper终极兼容性解决方案指南

如何在Windows 10/11上复活经典游戏:dxwrapper终极兼容性解决方案指南

如何在Windows 10/11上复活经典游戏:dxwrapper终极兼容性解决方案指南 【免费下载链接】dxwrapper Fixes compatibility issues with older games running on Windows 10/11 by wrapping DirectX dlls. Also allows loading custom libraries with the file extensi…

2026/7/28 4:13:11 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻