1234567891011121314151617181920212223242526272829303132333435363738 |
- const { drizzle } = require('drizzle-orm/node-postgres');
- const { Pool } = require('pg');
- const { sql, gt, desc } = require('drizzle-orm');
- const { vercelAiEmbeddings } = require('./schema.service');
- const config = require('../../config');
- const { cosineDistance } = require('drizzle-orm/sql');
- const pool = new Pool({
- connectionString: config.DATABASE_URL,
- min: 2,
- max: 10,
- });
- const db = drizzle(pool);
- // 实现相似度查询
- async function findSimilarContent(userQueryEmbedded) {
- // 手动将数组转换为 PostgreSQL 支持的数组格式
- const embeddingArray = `{${userQueryEmbedded.join(',')}}`;
- // 使用 sql 模板字面量构建原始 SQL 查询
- // const similarity = sql`1 - (cosine_distance(${vercelAiEmbeddings.embedding}, ${embeddingArray}::float[]))`;
- const similarity = sql`1 - (${cosineDistance(vercelAiEmbeddings.embedding, userQueryEmbedded)})`;
- return db
- .select({
- content: vercelAiEmbeddings.content,
- similarity,
- })
- .from(vercelAiEmbeddings)
- .where(gt(similarity, 0.5)) // 过滤相似度大于 0.5 的结果
- .orderBy((t) => desc(t.similarity)) // 按相似度降序排列
- .limit(4); // 限制返回 4 条结果
- }
- module.exports = {
- db,
- findSimilarContent,
- };
|