向量数据库使用样例
用 chroma 作为向量数据库,测试、写一下和 AI embedding 的集成。
向量数据库
参考 langchain 的文档,使用 [chroma] 作为向量数据库的持久层。
安装&启动
因为代理的关系,使用 Google 的 Docker Hub Mirrors 来进行加速。
$ docker pull mirror.gcr.io/chromadb/chroma
$ docker run -p 8000:8000 mirror.gcr.io/chromadb/chroma
客户端 Demo
安装依赖:
$ npm i chromadb chromadb-default-embed
# 相关版本如下
# "chromadb": "^1.8.1",
# "chromadb-default-embed": "^2.13.2"
$ touch index.mjs
编写客户端代码如下:
import { ChromaClient } from 'chromadb'
const client = new ChromaClient();
const collection = await client.createCollection({
    name: 'test',
    metadata: { "hnsw:space": "cosine" },
})
await collection.add({
    ids: ["id1", "id2", "id3"],
    embeddings: [[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2]],
    metadatas: [{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}],
})
const result = await collection.query({
    queryEmbeddings: [[11.1, 12.1, 13.1],[1.1, 2.3, 3.2]],
    nResults: 10,
})
console.log(result);
测试启动
$ node ./index.mjs
AI embedding
embeddingFunction, 以阿里云的 text-embedding 为例
export default async texts => {
  const res = await fetch(
    `https://dashscope.aliyuncs.com/api/v1/services/embeddings/text-embedding/text-embedding`,
    {
      headers: {
        Authorization: 'xxxx',
        'Content-Type': 'application/json'
      },
      method: 'POST',
      body: JSON.stringify({
        model: 'text-embedding-v1',
        input: {
          texts
        },
        parameters: {
          text_type: 'query'
        }
      })
    }
  ).then(d => d.json())
  return res.output.embeddings?.map(t => t.embedding)
}
Insert documents
import { ChromaClient } from 'chromadb'
import embeddingFunction from './embeddingFunction.mjs'
const client = new ChromaClient()
const collection = await client.getOrCreateCollection({
  name: 'gemini-test2',
  // metadata: { 'hnsw:space': 'cosine' },
  metadata: { 'hnsw:space': 'l2' },
  embeddingFunction: {
    generate: embeddingFunction,
  }
})
const documents =
  `政治学研究的最高目标应该是改善每一位普通人的生活境况,唯有此,政治学才能具有强大的生命力。
中国文化之精髓:合知行,一天人,同真善。任何文化只有在适于其滋长的土壤才能发挥作用。要影响、改变、铲除某些文化,必须从其土壤开始研究。社会存在决定社会意识。`.split(
    '\n'
  )
collection.add({
  ids: Object.keys(documents),
  documents
})
查询
import { ChromaClient } from 'chromadb'
import embeddingFunction from './embeddingFunction.mjs';
import fs from 'fs'
const client = new ChromaClient()
const collection = await client.getOrCreateCollection({
  name: 'gemini-test2',
  // metadata: { 'hnsw:space': 'cosine' },
  metadata: { 'hnsw:space': 'l2' },
})
const results = await collection.get({ ids:
['0', '1'],
include: ["embeddings", "metadatas", "documents"] })
const jsons = {};
results.embeddings.forEach((embedding, index) => {
  // 因为后续的 k-means 聚类的格式是如此,所以我们适配一下想过数据格式
  // 样例格式:{ "测试文本1": "[1, 2, 3]", "测试文本2": "[1, ,1, 2]"}
  jsons[results.documents[index]] = JSON.stringify(embedding);
})
console.log(results)
fs.writeFileSync('./embeddings.json', JSON.stringify(jsons))
聚类
参考之前的 k-means 聚类
用我 自己的笔记 做了一下测试:
0 从高度概括的意义上...
0 政治学研究的最高目...
0 民主不仅是政治制度...
0 社会主义初级阶段的...
1 一个宏观机制如果事...
1 中国文化之精髓:合...
1 企业公司管理的核心...
1 对企业家阶层的期望...
1 映射到日常管理中,...
1 生产力决定生产关系...
1 随着现生产活动和社...
2 改革前,权力过分集...
2 权力集中在战争和建...
2 权力集中的帝制是对...