https://www.notion.so/laisky/Optimize-generative-AI-applications-with-pgvector-indexing-A-deep-dive-into-IVFFlat-and-HNSW-techni-2a0ba4011a86816982add72c317f7a4c,由 aws 撰写的一片关于 pgvector 索引的文章。
在 LLM RAG 领域,为了处理较长的输入,通常会将文本拆分成较小的 chunks,然后在一些预处理后,将这些 chunks 通过 embeddings 模型生成 vector,存储于向量数据库中。当用户发起查询时,系统会将查询文本同样通过 embeddings 模型生成 vector,然后在向量数据库中进行相似度搜索,找到最相关的 chunks 作为上下文补充。
postgres 搭配 pgvector 插件,是一种常见的向量数据库实现方式。在向量数据库中进行查询,其实就是寻找和目标向量“最相似”的一组向量,“相似”的度量手段有三种:
* L2 距离(Euclidean Distance):计算两个向量之间的欧氏距离。
* Cosine 相似度(Cosine Similarity):计算两个向量之间的夹角余弦值。
* 内积(Inner Product):计算两个向量的点积。可以衡量向量的相似性。
默认情况下,也就是不建立索引时,pgvector 会进行遍历搜索。为了提高搜索性能,提供了两种索引索引:
* IVFFlat 索引(Inverted File with Flat quantization):IVFFlat 是一种基于有监督聚类的近似最近邻搜索算法。它通过将向量空间划分为多个 regions。搜索时,首先仅需要搜索各个 regions 的中心点,找出相关 region 后,再搜索 region 内的向量。
* HNSW 索引(Hierarchical Navigable Small World graphs):HNSW 是一种基于图结构的近似最近邻搜索算法。可以理解为 skiplist,先从最上层(节点最少的层)开始搜索,找到最近点后,作为下一层的起始点继续搜索,逐层往下,直到最底层。
这两种索引都可以显著减少搜索时需要比较的向量数量,从而提升查询速度。而且,为了避免局部最优解,可以设定以多个起始点的方式进行搜索。
文中对 58.6 K 个,总大小为 364 MB 的向量集进行了测试(pgvector 0.6):
* 不使用索引,搜索耗时 650 ms
* 使用 IVFFlat 索引,建立索引 15.5 s,搜索耗时 2.4 ms
* 使用 HNSW 索引,建立索引 30 s,搜索耗时 1.58 ms
可以看出,使用索引对搜索性能提升是很大的。
2,910
19
0
Laisky's Notes
2026年4月29日 15:17
https://laisky.notion.site/Time-Zone-Handling-for-Software-Engineers-A-Comprehensive-Technical-Handbook-2b3ba4011a8680f2b895f51f19b62dad?source=copy_link
让 DeepResearch 帮忙总结了一篇关于时区的报告。最近都不怎么喜欢搜索文章了,想到什么问题就扔给 DeepResearch 让它给我写一篇报告。
因为中国只有一个时区,很多开发人员都会忽略时区问题,我加入很多团队都帮忙处理过时区相关的问题(另一个经常被忽略的是编码问题)。
首先,在用户看不见的后端使用 UTC 时间是一个很好的习惯,但是 UTC 并不是银弹,并不能取代时区。
时区并不仅仅只是相对于 UTC 的一个固定偏移量,而是代表某一地区时间变化的历史和规则。比如某地可能在某一个时刻,决定让时钟拨快或拨慢一小时,这些规则的处理都必须依赖准确的当地时区数据,而不是 UTC 能够解决的。同理,不同的时区也不能随意的互相替换,即使在当前时刻它们的 UTC 偏移量相同。
比如关于冬令时/夏令时的调整,就会导致当地的某一时刻在两个不同时区出现两次,而另一个时刻则根本不存在。
关于时间的存储,UTC 仅能满足对于时刻的存储需求。只要涉及到当地事件、时间的相对计算、日程安排(牵涉星期、月份日期、节假日)等,都必须结合使用当地时区信息进行计算。而且由于用户可能会进行跨时区迁移,最好能够让用户自行选择自己的时区信息(比如 Google Calendar 的做法)。
重点:
* 如果你只需要时刻信息(Instant),使用 UTC 存储和传输是一个好习惯。
* 但是如果你需要任何基于当地时间的计算,必须携带时区信息。
BTW,时区的英文缩写存在重名,在沟通中不要使用简写。比如 CST 既可以是 China Standard Time 也可以是 Central Standard Time。 我以前和美国的团队协作时就遇到过歧义。