那些网站可以做自媒体,网站分享正能量,网站首页策划怎么做,wordpress前台很慢在之前的文章 “Elasticsearch 开放推理 API 新增阿里云 AI 搜索支持”#xff0c;它详细描述了如何使用 Elastic inference API 来针对阿里的密集向量模型#xff0c;稀疏向量模型#xff0c; 重新排名及 completion 进行展示。在那篇文章里#xff0c;它使用了很多的英文…
在之前的文章 “Elasticsearch 开放推理 API 新增阿里云 AI 搜索支持”它详细描述了如何使用 Elastic inference API 来针对阿里的密集向量模型稀疏向量模型 重新排名及 completion 进行展示。在那篇文章里它使用了很多的英文的例子。我觉得阿里的模型更适合中文字来进行展示。我们知道 Elastic 的开箱即用的稀疏向量模型 ELSER 只适合英文。目前它不支持中文。恰好阿里的稀疏向量模型填补了这个空白。稀疏向量可以开箱即用。对于很多不是很精通人工智能的开发者来说这无疑是个福音而且它使用的资源很小。
更多阅读请参阅 “阿里云 AI 搜索推理服务”。 稀疏向量
根据文档我们使用如下的命令来创建稀疏向量的推理 API 端点
PUT _inference/sparse_embedding/alibabacloud_ai_search_sparse
{service: alibabacloud-ai-search,service_settings: {api_key: api_key,service_id: ops-text-sparse-embedding-001,host: default-j01.platform-cn-shanghai.opensearch.aliyuncs.com,workspace: default}
}
在上面我们需要从阿里云获得 api_key 来进行。运行上面的命令 我们接下来可以通过如下的方式来测试如下信息由地址获得
POST _inference/alibabacloud_ai_search_sparse
{input: 阿里巴巴中国有限公司成立于2007年03月26日法定代表人蒋芳
}
上面的命令显示的结果为 我们从上面的显示结果可以看出来它和我们之前的 Elastic ELSER 输出是不同的。这里应该是 unicode。 上面的命令和下面的命令是一样的
POST _inference/sparse_embedding/alibabacloud_ai_search_sparse
{input: 阿里巴巴中国有限公司成立于2007年03月26日法定代表人蒋芳
}因为每个 endpoint 在 Elasticsearch 创建时都会自动检测并识别出它是什么类型的模型所以上面路径中的 sparse_embedding 是可以省去的。 密集向量
同样根据文档我们使用如下的命令来创密集向量的推理 API 端点
PUT _inference/text_embedding/alibabacloud_ai_search_embeddings
{service: alibabacloud-ai-search,service_settings: {api_key: api_key,service_id: ops-text-embedding-001,host: default-j01.platform-cn-shanghai.opensearch.aliyuncs.com,workspace: default}
}
运行上面的命令我们可以看到 我们可以使用如下的命令来生成密集向量
POST _inference/alibabacloud_ai_search_embeddings
{input: 阿里巴巴中国有限公司成立于2007年03月26日法定代表人蒋芳
} 密集向量是一个浮点数的数组。我们在生成的时候其实还是可以对它进行标量量化这样可以节省内存消耗并提高搜索的速度。更多有关向量量化的信息请阅读文章 “Elasticsearchdense vector 数据类型及标量量化”。 完成 - completion
我们甚至可以针对搜索的结果运用大模型来得到一个 completion 的结果比如我们使用如下的命令来生成一个 completion 的推理 API 端点
PUT _inference/completion/alibabacloud_ai_search_completion
{service: alibabacloud-ai-search,service_settings: {host : default-j01.platform-cn-shanghai.opensearch.aliyuncs.com,api_key: {{API_KEY}},service_id: ops-qwen-turbo,workspace : default}
} 我们可以通过如下的例子来展示 completion
POST _inference/completion/alibabacloud_ai_search_completion
{input: 阿里巴巴中国有限公司是什么时候成立的?
} 这个结果是结合大模型而生成的。大模型提供了一个基于在大模型训练时得到的结果。 重新排名 - rerank
同样我们可以按照如下的命令来生成一个 rerank 的推理 API 端点
PUT _inference/rerank/alibabacloud_ai_search_rerank
{service: alibabacloud-ai-search,service_settings: {api_key: api_key,service_id: ops-bge-reranker-larger,host: default-j01.platform-cn-shanghai.opensearch.aliyuncs.com,workspace: default}
} 我们可以使用如下的例子来进行展示
POST _inference/alibabacloud_ai_search_rerank
{query: 阿里巴巴中国有限公司是哪一年成立的,input: [阿里巴巴是全球领先的B2B电子商务网上贸易平台,阿里巴巴中国有限公司成立于2007年03月26日法定代表人蒋芳]
}
在上面的 input 里我们列举了两个文档。我们可以通过 rerank 端点来针对这两个文档重新进行排序。假如我们想搜索的文字是 “阿里巴巴中国有限公司是哪一年成立的”。那么 rerank 返回来的结果是 从上面我们可以看出来第二个文档比第一个文档更为贴近也就是它的相关度更高。 RAG 应用
在很多情况下我们企业有很多的业务数据或者私有数据每时每刻都在生成而大模型的知识仅限于在它生成的时候所以很多的时候大模型有很多的知识是不知道的。如果我们不对大模型的回答进行限制那么它可能给出的答案就是错误的从而产生幻觉。在实际的应用中我们通常把业务或私有数据保存于像 Elasticsearch 这样的向量数据库中。在搜索时我们首先搜索 Elasticsearch并把搜索的结果发送给大模型做为 prompt 的一部分这样就可以解决幻觉的问题。 首先我们来创建一个稀疏向量索引
PUT alibaba_sparse
{mappings: {properties: {inference_field: {type: semantic_text,inference_id: alibabacloud_ai_search_sparse}}}
}请注意在上面我们使用了 semantic_text 字段。它使用于密集向量及稀疏向量并且它还可以自动帮我们的文档进行分片。 有关分片的更多知识请阅读文章 “Elasticsearch检索增强生成背后的重要思想”。
然后我们写入如下的两个文档
PUT alibaba_sparse/_bulk
{index: {_id: 1}}
{inference_field: 阿里巴巴中国有限公司成立于2007年03月26日法定代表人蒋芳}
{index: {_id: 2}}
{inference_field: 百度是拥有强大互联网基础的领先AI公司。百度愿景是成为最懂用户并能帮助人们成长的全球顶级高科技公司。于2000年1月1日在中关村创建了百度公司}
我们通过如下的命令来进行搜索
GET alibaba_sparse/_search
{query: {semantic: {field: inference_field,query: 百度公司是哪年成立的}}
}
上面搜索的结果为 很显然含有百度的文档排在第一的位置。这个就是我们所说的向量搜索。
在实际的很多例子中我们有时想得到一个唯一的答案甚至这个答案是推理出来的而不原始的文档。这个时候我们就需要用到大模型也就是使用 completion 这个推理端点。
我们首先来做如下的搜索
GET alibaba_sparse/_search
{query: {semantic: {field: inference_field,query: 阿里巴巴公司的法人是谁}}
} 这次只有一个文档被列出来了。我们在下面使用 completion 端点
POST _inference/completion/alibabacloud_ai_search_completion
{input: |system|你是一个知识渊博的人./s|user|CONTEXT:阿里巴巴中国有限公司成立于2007年03月26日法定代表人蒋芳QUESTION: 阿里巴巴公司的法人是谁/s|assistant|
}
在上面我们把上面搜索的结果文档 “阿里巴巴中国有限公司成立于2007年03月26日法定代表人蒋芳” 作为 context 的一部分并把搜索的问题也一并提交。我们使用 completion 端点 API 来查看结果 上面显示的结果是 “阿里巴巴公司的法定代表人是蒋芳”。很显然这个和之前的直接使用 completion 而没有 context 的结果是完全不同的
POST _inference/completion/alibabacloud_ai_search_completion
{input: 阿里巴巴法定代表是谁?
} 我们可以这么理解有了从 Elasticsearch 向量数据库实时业务数据或私有数据中搜索来的结果并提供给大模型大模型可以根据这些上下文得到更为贴近答案的搜索结果。这个在实际的使用中避免幻觉
另外一个例子
POST _inference/completion/alibabacloud_ai_search_completion
{input: |system|你是一个知识渊博的人./s|user|CONTEXT:阿里巴巴中国有限公司成立于2007年03月26日法定代表人蒋芳QUESTION: 阿里巴巴中国有限公司是什么时候成立的/s|assistant|
}有关如何构建提示prompt请参阅我之前的文章 “为生成式人工智能制作 prompt 三明治”。
按照同样的方法我们来创建一个密集向量的索引
PUT alibaba_dense
{mappings: {properties: {inference_field: {type: semantic_text,inference_id: alibabacloud_ai_search_embeddings}}}
}
我们按照同样的方法来写入文档
PUT alibaba_dense/_bulk
{index: {_id: 1}}
{inference_field: 阿里巴巴中国有限公司成立于2007年03月26日法定代表人蒋芳}
{index: {_id: 2}}
{inference_field: 百度是拥有强大互联网基础的领先AI公司。百度愿景是成为最懂用户并能帮助人们成长的全球顶级高科技公司。于2000年1月1日在中关村创建了百度公司}我们来对这个密集向量索引 alibaba_dense 来进行搜索
GET alibaba_dense/_search
{query: {semantic: {field: inference_field,query: Alibaba 的法人是谁}}
} 很显然在我们的搜索中我们并没有使用 “阿里巴巴”我们查询的是 Alibaba。在向量空间里 “阿里巴巴” 等同于 “Alibaba”。同样地
GET alibaba_dense/_search
{query: {semantic: {field: inference_field,query: Baidu 是什么样的公司}}
}
上面的搜索的结果是 很显然含有 “百度” 的文档排名为第一尽管我们搜索的是 “Baidu”。
好的今天的分享就到这里。