db.service.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. const { drizzle } = require('drizzle-orm/node-postgres');
  2. const { Pool } = require('pg');
  3. const { sql, gt, desc } = require('drizzle-orm');
  4. const { vercelAiEmbeddings } = require('./schema.service');
  5. const config = require('../../config');
  6. const { cosineDistance } = require('drizzle-orm/sql');
  7. const pool = new Pool({
  8. connectionString: config.DATABASE_URL,
  9. min: 2,
  10. max: 10,
  11. });
  12. const db = drizzle(pool);
  13. // 实现相似度查询
  14. async function findSimilarContent(userQueryEmbedded) {
  15. // 手动将数组转换为 PostgreSQL 支持的数组格式
  16. const embeddingArray = `{${userQueryEmbedded.join(',')}}`;
  17. // 使用 sql 模板字面量构建原始 SQL 查询
  18. // const similarity = sql`1 - (cosine_distance(${vercelAiEmbeddings.embedding}, ${embeddingArray}::float[]))`;
  19. const similarity = sql`1 - (${cosineDistance(vercelAiEmbeddings.embedding, userQueryEmbedded)})`;
  20. return db
  21. .select({
  22. content: vercelAiEmbeddings.content,
  23. similarity,
  24. })
  25. .from(vercelAiEmbeddings)
  26. .where(gt(similarity, 0.5)) // 过滤相似度大于 0.5 的结果
  27. .orderBy((t) => desc(t.similarity)) // 按相似度降序排列
  28. .limit(4); // 限制返回 4 条结果
  29. }
  30. module.exports = {
  31. db,
  32. findSimilarContent,
  33. };