在 RAG
应用开发中,想根据不同的问题检索不同的 检索器/向量数据库,其实只需要设定要对应的 Prompt
,然后让 LLM
根据传递的问题返回需要选择的 检索器/向量数据库 的名称,然后根据得到的名称选择不同的 检索器 即可。
但是对于 LLM
来说,如果使用普通的 prompt
来约束输出内容的格式与规范,因为 LLM
的特性,很难保证输出格式符合特定的需求,所以可以考虑使用 函数回调 来实现,即设定一个 虚假的函数,告诉 LLM
,这个函数有对应的参数,让 LLM
强制调用这个函数,这个时候 LLM
就会输出函数的调用参数,从而保证输出的统一性。
资料推荐
- 💡大模型中转API推荐
- ✨中转使用教程
- ✨模型优惠查询
使用 函数回调
实现的检索器逻辑路由运行流程图如下:假设目前有 3 个向量数据库/集合,分别代表
python_docs
、js_docs
、golang_docs
,需要根据用户传递的问题判断与哪个向量数据库最接近,使用最接近的向量数据库进行检索,代码示例:
from typing import Literalimport dotenv
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAIdotenv.load_dotenv()class RouteQuery(BaseModel):"""将用户查询映射到最相关的数据源"""datasource: Literal["python_docs", "js_docs", "golang_docs"] = Field(description="根据给定用户问题,选择哪个数据源最相关以回答他们的问题")def choose_route(result: RouteQuery):if "python_docs" in result.datasource.lower():return "chain for python_docs"elif "js_docs" in result.datasource.lower():return "chain for js_docs"else:return "golang_docs"# 1.构建大语言模型并进行结构化输出
llm = ChatOpenAI(model="gpt-3.5-turbo-16k", temperature=0)
structured_llm = llm.with_structured_output(RouteQuery)# 2.创建路由逻辑链
prompt = ChatPromptTemplate.from_messages([("system", "你是一个擅长将用户问题路由到适当的数据源的专家。\n请根据问题涉及的编程语言,将其路由到相关数据源"),("human", "{question}")
])
router = {"question": RunnablePassthrough()} | prompt | structured_llm | choose_route# 3.执行相应的提问,检查映射的路由
question = """为什么下面的代码不工作了,请帮我检查下:from langchain_core.prompts import ChatPromptTemplateprompt = ChatPromptTemplate.from_messages(["human", "speak in {language}"])
prompt.invoke("中文")"""# 4.选择不同的数据库
print(router.invoke(question))
输出内容:
datasource='python_docs'
chain for python_docs
资料推荐
- 💡大模型中转API推荐
- ✨中转使用教程
- ✨模型优惠查询