alibaba / higress

🤖 AI Gateway | AI Native API Gateway
https://higress.io
Apache License 2.0
2.83k stars 468 forks source link

Higress 意图路由 AI_intent插件设计 #1201

Closed qiangruoyu closed 2 weeks ago

qiangruoyu commented 4 weeks ago

AI_intent

插件设计背景

随着大模型技术的广泛应用和普及,如何有效地减少tokens消耗并提升模型在特定领域和场景中的表现成为了当前AI发展的重要挑战。为了实现这些目标,目前的解决方案大多依赖于AI缓存插件和多种插件、agent的组合。然而,这些解决方案存在一些问题:

  1. 存储和搜索的效率:

    现有的大模型请求往往为了降低tokens的使用,采用AI缓存插件,将问题和答案存储在向量数据库中。这些数据库由于存储容量的限制,通常需要拆分成多个子库进行管理。这导致了在向量搜索过程中,需要对所有子库进行全量搜索,从而增加了计算成本和搜索时间。此外,不同场景下的存储容量难以精确控制,可能导致资源的浪费或不足。

  2. 复杂的用户交互:

    为了提升大模型在特定领域和场景下的效果,通常会针对不同场景或领域进行专项优化。这种优化通常通过多个不同的插件、agent、以及模型入口实现。然而,用户在实际应用过程中,往往需要面对多个“助手”,这不仅增加了用户学习和使用的难度,也降低了用户体验。随着这种小工具的数量持续增加,用户的依赖性和满意度可能进一步下降。

因此,设计一个AI插件,能够智能判断用户请求与某个领域或agent的功能契合度,并将请求自动路由到对应的服务,从而提升模型的应用效果和用户体验,显得尤为重要。

设计内容摘要

方案:

  1. 通过语义性质判断请求与领域、agent的契合度。通过访问较小的LLM模型或专有模型判断请求所属的场景类别。自动将请求分发到相应的服务中。

  2. AI缓存插件根据场景预设不同的向量数据库大小,实现AI缓存插件在不同场景下的定量存储,有效管理不同场景下的存储容量。

  3. 多助手集成同一入口,优化用户体验。将多个不同的助手和插件整合到同一个入口,简化用户的操作步骤。通过智能调度,提升用户在应用过程中的便捷性和效率。提高用户对服务的依赖性和满意度,减少用户面对多个工具时的困扰。

实现方式:

image

  1. 预设场景:预设多个不同领域或者场景。在请求中添加一个property。
  2. prompt拼接:内置一个默认的prompt,prompt中要求输出直接为类别号,获取用户请求,拼接prompt。
  3. 判断类别:将拼接好的prompt请求 llm,请求的llm为higress网关中的另一个路由,复用ai proxy插件。根据llm返回的结果填写property。将请求转发给其他插件。llm的选择可根据场景分类的复杂程度选择不同大小的模型,如1.5B,7B。(由于考虑到插件即插即用的方式,这里不推荐用户再训练一个文本分类的小模型。)
  4. AI cache、AI Proxy根据property值判断分类结果。AI cache 根据分类结果请求不同的子库。AI Proxy根据不同的分类结果请求不同的模型。

通过以上步骤,该AI插件能够高效地管理和优化大模型在不同场景下的应用表现,提升用户对AI技术的信任和依赖性,同时有效降低tokens的使用,优化资源分配。增加网关的ai能力,加快网关由规则化到智能化的提升。

参数配置

名称 数值类型 填写要求 默认值 描述
dashscope.ServiceName string 必填 - higress 中注册的llm服务名称
dashscope.modelName string 必填 - 用于分类的模型名称
scene.category string 必填 - 预设场景类别
Embeddding.prompt string 非必填 见示例 llm请求prompt模板

 

 示例:

dashscope:
  ServiceName: "dashscope"
  modelName: "qwen-xxx"

scene:
  category: ["金融","电商","法律"]
  prompt: "你是一个智能类别识别助手,负责根据用户提出的问题和预设的类别,确定问题属于哪个预设的类别,并给出相应的类别。用户提出的问题为{question},预设的类别为{category},问题的类别为:"

 

johnlanni commented 4 weeks ago

@qiangruoyu 向量化和聚类分析依赖离线数据处理,没法在这个插件里自闭环,用户使用成本也比较高,我建议设计成支持用户预设一些领域,然后让LLM对问题进行领域分类,然后为请求设置property,然后提供其他插件使用这个property,例如缓存插件可以基于property分不同库,Proxy插件可以基于property路由到不同模型

qiangruoyu commented 4 weeks ago

@johnlanni 已修改

johnlanni commented 4 weeks ago

@qiangruoyu 可以不用配置dasahcope字段,只需定义服务即可,可以把网关自身作为一个服务(127.0.0.1),然后复用网关的AI Proxy能力,统一用openai协议对接多个不同大模型

qiangruoyu commented 3 weeks ago

@johnlanni 已修改,类别判断的时候访问自身的服务,并保留了可以更换分类llm的字段。