AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


RAG实战篇:精准判断用户查询意图,自动选择最佳处理方案
发布日期:2024-09-30 20:11:06 浏览次数: 1689 来源:风叔云



在这篇文章中,围绕Routing(路由)环节,如下图橙色框内所示,风叔详细介绍一下面对不同的用户输入,如何让大模型更智能地路由到最佳方案。

路由的作用,是为每个Query选择最合适的处理管道,以及依据来自模型的输入或补充的元数据,来确定将启用哪些模块。比如当用户的输入问题涉及到跨文档检索、或者对于复杂文档构建了多级索引时,就需要使用路由机制。

下面,我们结合源代码,介绍一下Logical routing(基于逻辑的路由)和Sematic Routing(基于语义的路由)两种方案。具体的源代码地址可以在文末获取。


Logical routing(基于逻辑的路由)

基于逻辑的路由,其原理非常简单。大模型接收到问题之后,根据决策步骤,去选择正确的索引数据库,比如图数据库、向量数据库等等,如下图所示。

使用函数调用(function calling)来产生结构化输出。

下面我们结合源代码来分析一下Logical Routing的流程:

  • 首先我们定义了三种文档,pytion、js、golang

  • 然后通过prompt告诉大模型,需要根据所涉及的编程语言,将用户问题路由到适当的数据源

  • 定义Router

# Data modelclass RouteQuery(BaseModel):"""Route a user query to the most relevant datasource."""
datasource: Literal["python_docs", "js_docs", "golang_docs"] = Field(...,description="Given a user question choose which datasource would be most relevant for answering their question",)
# LLM with function call llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)structured_llm = llm.with_structured_output(RouteQuery)
# Prompt system = """You are an expert at routing a user question to the appropriate data source.
Based on the programming language the question is referring to, route it to the relevant data source."""
prompt = ChatPromptTemplate.from_messages([("system", system),("human", "{question}"),])
# Define router router = prompt | structured_llm


接着给出了一个使用示例,用户提问后,路由器根据问题的内容判断出数据源为 python_docs,并返回了相应的结果。

question = """Why doesn't the following code work:
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages(["human", "speak in {language}"])prompt.invoke("french")"""
result = router.invoke({"question": question})result.datasource
def choose_route(result):if "python_docs" in result.datasource.lower():### Logic here return "chain for python_docs"elif "js_docs" in result.datasource.lower():### Logic here return "chain for js_docs"else:### Logic here return "golang_docs"
from langchain_core.runnables import RunnableLambda
full_chain = router | RunnableLambda(choose_route)full_chain.invoke({"question": question})


Sematic routing(基于语义的路由)

基于语义的路由,其原理也非常简单,大模型根据query的语义相似度,去自动配置不同的prompt。


我们先定义两种不同的Prompt,一个让大模型扮演物理专家,一个让大模型扮演数学专家,并将其转为嵌入向量。

# Two promptsphysics_template = """You are a very smart physics professor. \You are great at answering questions about physics in a concise and easy to understand manner. \When you don't know the answer to a question you admit that you don't know.
Here is a question:{query}"""
math_template = """You are a very good mathematician. You are great at answering math questions. \You are so good because you are able to break down hard problems into their component parts, \answer the component parts, and then put them together to answer the broader question.
Here is a question:{query}"""
embeddings = OpenAIEmbeddings()prompt_templates = [physics_template, math_template]prompt_embeddings = embeddings.embed_documents(prompt_templates)


然后计算query embedding和prompt embedding的向量相似度

# Route question to prompt def prompt_router(input):# Embed questionquery_embedding = embeddings.embed_query(input["query"])# Compute similaritysimilarity = cosine_similarity([query_embedding], prompt_embeddings)[0]most_similar = prompt_templates[similarity.argmax()]# Chosen prompt print("Using MATH" if most_similar == math_template else "Using PHYSICS")return PromptTemplate.from_template(most_similar)

chain = ({"query": RunnablePassthrough()}| RunnableLambda(prompt_router)| ChatOpenAI()| StrOutputParser())
print(chain.invoke("What's a black hole"))


在上述案例中,最终的输出会使用物理专家的Prompt。

到这里,两种常用的路由策略就介绍完了。当然,我们也可以自主构建更复杂的路由策略,比如构建专门的分类器、打分器等等,这里就不详细展开了。


总结

在这篇文章中,风叔介绍了实现查询路由的具体方法,包括Logical routing和Semantic routing两种实现方式。

很多时候,在一些特殊的场景下,我们需要将用户的输入转化为特定的语句,比如数据库查询动作。在下一篇文章中,风叔将重点围绕Query Construction(查询构建)环节,介绍如何将用户输入转变为特定的系统执行语句。

最后,风叔预祝大家国庆节快乐!



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询