关于微软最新数据库引擎sqlserver2025 关于向量距离函数调用的问题

开源AI·十一月创作之星挑战赛 10w+人浏览 587人参与

关于微软最新数据库引擎sqlserver2025 关于向量距离函数调用的问题

已经通过模型将知识库分段向量1024维存入数据库,现在要实现RAG,需要从向量数据中检索出相似知识片段,然后将片段作为输入告诉人工智能后提问,实现RAG增强。
但是问题来了,微软发布的最新数据库引擎支持三个向量函数,
VECTOR_DISTANCE // 计算向量距离相似度 支持 cosine - 余弦距离 euclidean - Euclidean 距离 dot - (负数) 点积
VECTOR_SEARCH // 搜索向量距离 这个函数需要建立 VECTOR_INDEX 索引方可使用
因为知识库是动态知识库,而且向量索引建立以后数据不可以增删改,需要删除索引修改完在重建对
对于小数据量,知识库数据50000以下不建议创建索引,直接使用VECTOR_DISTANCE计算。
微软提供的例子都是在存储过程中实现向量相似度计算,但是我们的知识库是动态知识库,按照一个知识库对应一个向量集合表,那么存储过程需要拼接数据库表命,语法太乱了不喜欢,那么如何直接通过TSQL语句直接计算向量向量相似度呢?
首先直接把1024维的float 作为参数传入sql语句,会报一个 varchar 超过长度问题,其实不难理解,毕竟是预览版,微软的工程师也是在摸索呢,所以用 varchar(max) 封装了 vector 类型。
所以经过我仔细研究,可以通过 CAST(‘[1.5,2.3,0.8…]’ AS vector(1024)) 转换向量类型,然后传入SQL语句 就可以直接在 netcore _context.Database.ExecuteSqlRaw(SqlCmd); 执行。

SELECT TOP(2) * FROM [dbo].[Vector_efc5013f0432473294a5991163e8f441] ORDER BY VECTOR_DISTANCE(‘cosine’,CAST(‘[-1.6799299e+000,2.7846149e-001,-9.0215802e-001,-8.3536464e-001,-1.5517933e+000,6.6706377e-001,5.9230852e-001,-5.1769388e-001,-5.9696758e-001,3.4299669e-001,5.3145283e-001,6.3425183e-001,-9.0269399e-001,-5.7276227e-002,9.0233982e-002]’ AS vector(1024)),Embedding)

在这里插入图片描述

### 在 SQL Server 中实现 MySQL 的 AES-128-ECB 加密功能 MySQL 的 `AES_ENCRYPT()` 函数默认使用 AES-128 算法和 ECB(Electronic Codebook)模式进行加密。ECB 模式是一种基础的加密模式,但由于其对相同明文块生成相同密文,可能存在一定的安全性问题。为了在 SQL Server 中实现与 MySQL 相同的加密行为,需要确保加密算法、密钥长度、加密模式以及数据填充方式一致。 SQL Server 提供了内置的加密函数 `ENCRYPTBYPASSPHRASE()` 和 `DECRYPTBYPASSPHRASE()`,但它们使用的是 Triple DES 算法,而不是 AES。为了实现 AES-128-ECB 模式,需要使用扩展机制,如 CLR 集成或调用外部程序集,或者通过自定义函数来实现 AES 加密逻辑。 以下是一个使用 CLR 集成实现 AES-128-ECB 加密的示例代码: #### SQL Server 中使用 CLR 实现 AES-128-ECB 加密 首先,在 .NET 中编写 AES 加密函数: ```csharp using System; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using System.Security.Cryptography; public partial class UserDefinedFunctions { [SqlFunction] public static SqlBytes AESEncrypt(SqlString plainText, SqlString key) { if (plainText.IsNull || key.IsNull) return new SqlBytes(); using (Aes aes = Aes.Create()) { aes.Key = System.Text.Encoding.UTF8.GetBytes(key.Value); aes.Mode = CipherMode.ECB; aes.Padding = PaddingMode.PKCS7; ICryptoTransform encryptor = aes.CreateEncryptor(); byte[] plainBytes = System.Text.Encoding.UTF8.GetBytes(plainText.Value); byte[] encryptedBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length); return new SqlBytes(encryptedBytes); } } } ``` 然后,在 SQL Server 中注册该程序集并创建函数: ```sql CREATE ASSEMBLY AESCrypto FROM 'C:\Path\To\Your\Assembly.dll' WITH PERMISSION_SET = SAFE; CREATE FUNCTION dbo.AESEncrypt(@plainText NVARCHAR(MAX), @key NVARCHAR(16)) RETURNS VARBINARY(MAX) AS EXTERNAL NAME AESCrypto.UserDefinedFunctions.AESEncrypt; ``` 调用示例: ```sql SELECT dbo.AESEncrypt('Hello World', '1234567890123456') AS EncryptedData; ``` 该函数生成的加密结果应与 MySQL 的 `AES_ENCRYPT('Hello World', '1234567890123456')` 保持一致,前提是密钥长度为 16 字节(即 AES-128),且使用 ECB 模式和 PKCS7 填充[^1]。 #### 注意事项 - MySQL 的 `AES_ENCRYPT()` 返回的是二进制数据,通常需要使用 `HEX()` 或 `TO_BASE64()` 转换为可存储的字符串格式。SQL Server 中的 `VARBINARY` 类型可以直接存储加密后的二进制数据,也可通过 `CONVERT()` 或自定义函数转换为十六进制或 Base64 编码[^2]。 - 由于 ECB 模式不提供数据混淆,对于安全性要求较高的场景,建议使用 CBC 模式,并在加密时引入随机初始化向量(IV)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值