微信扫码
与创始人交个朋友
我要投稿
前言
在《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 model
class 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 prompts
physics_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大模型实战篇:LATS,可能是目前最强的AI Agent设计框架
RAG实战篇:优化查询转换的五种高级方法,让大模型真正理解用户意图
风叔,某互联网大厂产品总监,十多年产品设计和商业化经验,对电商、营销、AI和大数据产品具备丰富的实战经验。风叔将坚持输出自己的总结和思考,希望对你有帮助。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-10-03
RAG实战篇:将用户输入转换为精确的数据库查询语言
2024-10-02
RAG(检索增强生成)新探索:IdentityRAG 提高 RAG 准确性
2024-10-02
2.7K+ Star!LlamaParse:一个为RAG和代理打造的文档解析神器
2024-10-01
你的RAG混合搜索效果不好?别着急上Reranking,先把RRF算法的K=60改了试试。
2024-10-01
LLM RAG面试问题大全!
2024-10-01
检索增强生成(RAG)与相关技术综述:问题、分类、数据、模型、挑战
2024-10-01
大模型RAG:基于PgSql的向量检索
2024-09-30
【RAG】HiQA:一种用于多文档问答的层次化上下文增强RAG
2024-07-18
2024-07-09
2024-07-09
2024-07-08
2024-06-20
2024-07-09
2024-05-05
2024-07-07
2024-07-07
2024-05-19
2024-09-30
2024-09-26
2024-09-26
2024-09-20
2024-09-16
2024-09-12
2024-09-11
2024-09-10