You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Azure AI Search索引器将字符串向量转为Collection(Edm.Single)

问题:Azure AI Search索引器将逗号分隔向量字符串转为Collection(Edm.Single)

现有Azure SQL表,Description列类型为varchar(1000),VectorValues列是varchar(max),存储的是text-embedding-ada-002生成的1536维向量的逗号分隔字符串。使用Azure AI Search索引器同步数据时,索引中VectorValues字段定义为Collection(Edm.Single)类型,之前尝试用jsonArrayToStringCollection映射函数无效(该函数仅支持字符串到字符串集合的转换),需解决格式转换问题。

索引字段定义如下:

{"name": "Description","type": "Edm.String", "searchable": "true", "retrievable": "true", "sortable": "false", "filterable": "false", "facetable": "false"},
{
  "name": "VectorValues",
  "type": "Collection(Edm.Single)",
  "dimensions": 1536,
  "vectorSearchProfile": "myHnswProfile",
  "searchable": "true",
  "retrievable": "true",
  "filterable": "false",
  "sortable": "false",
  "facetable": "false"
}

可行解决方案

方法1:修改ADF输出为JSON数组格式

在ADF调用OpenAI API生成向量后,不要把结果转成逗号分隔字符串,直接保存成JSON数组格式的字符串(比如[0.123, 0.456, ...])到SQL的VectorValues列。然后在索引器的字段映射里用jsonArrayToSingleCollection函数:

"fieldMappings" : [
  {
    "sourceFieldName" : "VectorValues", 
    "targetFieldName" : "VectorValues",
    "mappingFunction" : { "name" : "jsonArrayToSingleCollection" }
  }
]

这个函数能直接把JSON浮点数数组转成Collection(Edm.Single)类型,完全匹配索引要求。

方法2:用SQL计算列转换格式

如果改不了ADF的输出逻辑,就在SQL表里加一个计算列,把逗号分隔的字符串转成JSON数组:

ALTER TABLE 你的表名
ADD VectorJson AS CONCAT('[', VectorValues, ']') PERSISTED;

然后索引器的数据源指向这个VectorJson计算列,再用jsonArrayToSingleCollection映射函数完成转换,索引字段保持原有定义即可。

方法3:自定义技能处理转换(复杂场景)

要是前两种方法都用不了,就创建一个自定义技能(用Azure Function实现),接收逗号分隔的字符串,分割后转成浮点数数组再输出。核心逻辑示例:

public static async Task<IActionResult> Run(HttpRequest req)
{
    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    var data = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(requestBody);
    string vectorStr = data.values[0].data.VectorValues;
    float[] vectorArray = vectorStr.Split(',').Select(float.Parse).ToArray();
    
    var response = new {
        values = new[] {
            new {
                recordId = data.values[0].recordId,
                data = new { VectorValues = vectorArray },
                errors = (object[])null,
                warnings = (object[])null
            }
        }
    };
    return new OkObjectResult(response);
}

之后在索引器的技能集中添加这个自定义技能,把VectorValues字段传入处理后,输出到索引的对应字段。

内容的提问来源于stack exchange,提问作者user1001493

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:11:07