AI知识库

53AI知识库

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


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


前言

在《RAG实战篇:构建一个最小可行性的Rag系统》中,风叔详细介绍了Rag系统的整体实现框架,以及如何搭建一个最基本的Naive Rag。

在前面两篇文章中,风叔分别介绍了索引(Indexing)和查询转换(Query Translation)环节的优化方案。

在这篇文章中,围绕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 question    query_embedding = embeddings.embed_query(input["query"])    # Compute similarity    similarity = 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(查询构建)环节,介绍如何将用户输入转变为特定的系统执行语句。

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


更多精彩文章:

大佬们都在关注的AI Agent,到底是什么?用5W1H分析框架拆解AI Agent(上篇)

AI大模型实战篇:AI Agent设计模式 - ReAct

AI大模型实战篇:LATS,可能是目前最强的AI Agent设计框架

RAG实战篇:构建一个最小可行性的Rag系统

RAG实战篇:优化索引的四种高级方法

RAG实战篇:优化查询转换的五种高级方法,让大模型真正理解用户意图

风叔,某互联网大厂产品总监,十多年产品设计和商业化经验,对电商、营销、AI和大数据产品具备丰富的实战经验。风叔将坚持输出自己的总结和思考,希望对你有帮助。


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

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

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

联系我们

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

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询