在人工智能领域,理解和准确响应用户的查询是构建高效交互系统的关键。这篇文章将带你深入了解如何通过高级查询转换技术,优化大型语言模型的理解能力,使其更贴近用户的真正意图。
在中,风叔详细介绍了Rag系统的整体实现框架,以及如何搭建一个最基本的Naive Rag。
在前面两篇文章中,风叔分别介绍了索引(Indexing)和查询转换(Query Translation)环节的优化方案。
在这篇文章中,围绕Routing(路由)环节,如下图橙色框内所示,风叔详细介绍一下面对不同的用户输入,如何让大模型更智能地路由到最佳方案。
路由的作用,是为每个Query选择最合适的处理管道,以及依据来自模型的输入或补充的元数据,来确定将启用哪些模块。比如当用户的输入问题涉及到跨文档检索、或者对于复杂文档构建了多级索引时,就需要使用路由机制。
下面,我们结合源代码,介绍一下Logical routing(基于逻辑的路由)和Sematic Routing(基于语义的路由)两种方案。
基于逻辑的路由,其原理非常简单。大模型接收到问题之后,根据决策步骤,去选择正确的索引数据库,比如图数据库、向量数据库等等,如下图所示。
其使用函数调用(function calling)来产生结构化输出。
下面我们结合源代码来分析一下Logical Routing的流程:
- 首先我们定义了三种文档,pytion、js、golang
- 然后通过prompt告诉大模型,需要根据所涉及的编程语言,将用户问题路由到适当的数据源
- 定义Router
接着给出了一个使用示例,用户提问后,路由器根据问题的内容判断出数据源为 python_docs,并返回了相应的结果。
基于语义的路由,其原理也非常简单,大模型根据query的语义相似度,去自动配置不同的prompt。
我们先定义两种不同的prompt,一个让大模型扮演物理专家,一个让大模型扮演数学专家,并将其转为嵌入向量。
然后计算query embedding和prompt embedding的向量相似度
在上述案例中,最终的输出会使用物理专家的prompt。
到这里,两种常用的路由策略就介绍完了。当然,我们也可以自主构建更复杂的路由策略,比如构建专门的分类器、打分器等等,这里就不详细展开了。
在这篇文章中,风叔介绍了实现查询路由的具体方法,包括Logical routing和Semantic routing两种实现方式。