人造言语交互 落地的关键模块 大模型运行与LUI
在传统搜查运行中,有一个外围的模块叫用意识别,即识别用户搜查恳求时的用意,基于用意不同生成不同的Query或口头不同的逻辑。在RAG运行中,依然存在着相似的路由模块成功恳求散发。这样的路由散发需求无处不在,特意是在人造言语交互的运行中,并且会随着系统允许的场景和配置增多而变得越来越关键。所谓路由就是一个能够依据一段人造言语输入启动用意判别构成团圆输入的模块。
典型的场景比如自动客服中的指令义务散发,硬盘搜查助手依据用户需求搜查图片还是搜查文件。上方是一些经常出现的情形的总结。
1)基于疑问不同生成不同Prompt的状况,这和用意识别生成不同Query一样。
2)依据数据存储的多样性散发到不同数据存储和服务中,比如数据库、API等
3)即使存储介质相反,也或许存在多个须要散发的状况。
4)依据疑问的类型散发到不同的组件。比如,依据疑问的性质将查问散发给向量数据库、Agent或服务等。
关于路由的成功大抵分为两类,逻辑路由(Logical Routers)和 人造言语路由。相较于人造言语路由,逻辑路由不依赖于对路由输入的语义了解,而人造言语路由是须要关注语义的。
以下是这些路由的引见:
1.LLM 路由
应用 LLM 的决策(decision making )才干依据用户的查问散发。
a.LLM生成路由
这类路由应用 LLM Completion接口成功,要求 LLM 从揭示的单词选项列表中前往最能形容查问的单个单词。而后,该词可以作为 If/Else 条件的一局部来控制运行程序流程。
在llamaindex及LangChain都有这种思绪的成功。上方是 LangChain 的一个经常使用例子。
from langchain_anthropic import ChatAnthropicfrom langchain_core.output_parsers import StrOutputParserfrom langchain_core.prompts import PromptTemplate# Set up the LLM Chain to return a single word based on the query,# and based on a list of words we provide to it in the prompt templatellm_completion_select_route_chain = (PromptTemplate.from_template("""Given the user question below, classify it as eitherbeing about `LangChain`, `Anthropic`, or `Other`.Do not respond with more than one word.<question>{question}</question>Classification:""")| ChatAnthropic(model_name="claude-3-haiku")| StrOutputParser())# We setup an IF/Else condition to route the query to the correct chain# based on the LLM completion call abovedef route_to_chain(route_name):if "anthropic" == route_name.lower():return anthropic_chainelif "langchain" == route_name.lower():return langchain_chainelse:return general_chain...# Later on in the application, we can use the response from the LLM# completion chain to control (i.e route) the flow of the application# to the correct chain via the route_to_chain method we createdroute_name = llm_completion_select_route_chain.invoke(user_query)chain = route_to_chain(route_name)chain.invoke(user_query)
b.LLM 函数调用路由器
应用了 LLM 的function call才干来选用要口头的分支函数。
LlamaIndex中的Pydantic路由就是这个原理。大少数Agent选用要经常使用的正确工具也是驳回这样的模式。它们应用 LLM 的函数调用才干,依据用户的查问选用适宜的工具。上方是Pydantic路由的经常使用例子:
from llama_index.core.query_engine import RouterQueryEnginefrom llama_index.core.selectors import PydanticSingleSelectorfrom llama_index.core.selectors.pydantic_selectors import Pydanticfrom llama_index.core.tools import QueryEngineToolfrom llama_index.core import VectorStoreIndex, SummaryIndex# define query engines...# initialize toolslist_tool = QueryEngineTool.from_defaults(query_engine=list_query_engine,descriptinotallow="Useful for summarization questions related to the,)# initialize router query engine (single selection, pydantic)query_engine = RouterQueryEngine(selector=PydanticSingleSelector.from_defaults(),query_engine_tools=[list_tool,vector_tool,],)query_engine.query("<query>")
2.语义路由
应用语义关系性检索来选用最佳的分支。
每个路由都有一组与之关联的示例查问,这些查问会被embedding并存储为向量。传入的查问也会被embedding,并针对路由器中的其余示例查问启动相似性搜查。婚配度最高的查问的路由将被选中。
以semantic-router()这个名目为例了解其详细细节。例如,设置两个路由,一个用于政治疑问的问答,另一个用于普通闲谈类型的问答。关于每个路由都会调配一个理论或许被用来触发该路由分支的疑问列表。这些示例查问(utterances)将被embedding,以便可以将它们用于针对用户查问的相似性搜查。
from semantic_router import Route# we could use this as a guide for our chatbot to avoid political# conversationspolitics = Route(name="politics",utterances=["isn't politics the best thing ever","why don't you tell me about your political opinions","don't you just love the president","they're going to destroy this country!","they will save the country!",],)# this could be used as an indicator to our chatbot to switch to a more# conversational promptchitchat = Route(name="chitchat",utterances=["how's the weather today?","how are things going?","lovely weather today","the weather is horrendous","let's go to the chippy",],)# we place both of our decisions together into single listroutes = [politics, chitchat]#创立路由层encoder = OpenAIEncoder()from semantic_router.layer import RouteLayerroute_layer = RouteLayer(encoder=encoder, routes=routes)
经常使用时,输入疑问,便能取得路由决策。
route_layer("don't you love politics?").name# -> 'politics'
因为这种路由实质上是向量检索,无需调用LLM,因此比其余基于 LLM 的路由器更快。
3.零样本文本分类路由
零样本文本分类(Zero-shot text classification)是NLP中的一项义务,其中模型在一个标志样本集上启动训练,进而取得能够对来自先前未见过的样本启动分类,比如基于bert的分类器。
而这类路由便是应用零样本分类模型给一段文本打上标签,而这些标签来自于预约义的标签路由。
比如,Haystack 中的 ZeroShotTextRouter便是这种成功门路。详细参考:
4.言语分类路由
这类路由器能够识别查问所经常使用的言语,并依据该言语路由查问。假设运行程序须要某种多言语解析才干,这将十分有用。
比如,Haystack 中的 TextClassificationRouter,它应用 langdetect 库来检测文本的言语,该库自身经常使用豪华贝叶斯算法来检测言语。参考:
5.关键字路由
该类路由将尝试经过婚配查问和路由列表之间的关键字来选用分支。
这个关键字路由器也可以由 LLM 来识别关键字,或许由其余一些关键字婚配库来成功。
6.逻辑路由
它们经常使用逻辑审核变量,例如字符串长度、文件名和值比拟来解决如何路由查问。它们与编程中经常使用的典型 If/Else 条件十分相似。它们不是基于肯定了解人造言语查问的用意,而是可以依据现有和变量参数做出选用。典型成功如HayStack 中的 ConditionalRouter 和 FileTypeRouter。
小结
不论是RAG运行还是普通的业务系统,都存在着少量的分支判别,这种判别早期因为人造言语技术的落后(准确率和性能)造成大少数成功为语法判别,而随着LLM技术的开展,肯定会带动语义判别和散发需求的大开展,另一方面,随着人造言语交互(LUI)的始终遍及,路由模块将成为其中外围成功遭到更大注重。
参考:
本文转载自,作者: