单个本地大模型搭建参考博客
- 单个Chain:面对一个需求,我们需要创建一个llmchain,设置一个prompt模板,这个chain能够接收一个用户input,并输出一个结果;
- 多个Chain:考虑到同时面对多个需求,我们需要设置多个Chain。
Router Chain往往会配合下游的destination chain一起使用,成为“一个网关路由+多个下子链”的架构,实现根据用户输入,自动路由到最相关的下游chain
下图中是一个RouterChian使用场景的示意图,我们可以看到,一个RouterChain连接了多个下游的子链,每个链都是一个小应用,当RouterChain接收用户的输入,其可以根据用户输入路由到和输入最相关的子链上,并由子链产生输出;
例如,用户输入是“请帮我写一首诗”,当RouterChain接收后,会自动路由到“诗人”这个子链,由它来输出结果。
2.RouterChain构成
根据Langchain的介绍,标准的RouterChain
应用应包含两个标准组成部分:
- 路由链RouterChain:其本身就是一个chain应用,能够根据用户输入进行下游子链的选择;Langchain框架提供了多种RouterChain,其中着重介绍了
LLMRouterChain
和EmbeddingRouterChain
两种:LLMRouterChain
将用户输入放进大语言模型,通过Prompt的形式让大语言模型来进行路由EmbeddingRouterChain
通过向量搜索的方式,将用户输入
- 子链DestinationChain:直译为目标链,即可路由到的链,按照上图,我们会存在4个目标链,分别是lawyer chain,sales chain,english teacher chain 和 poet chain
3.MultiPromptChain构成
MultiPromptChain
应用应包含两个标准组成部分
- router_chain:接收一个RouterChain实例,作为路由链进行路由
default_chain:接收一个LLMChain实例,当Router Chain无法找到合适的下游子链时,会自动路由到的默认链,可以认为是一个兜底备选链 - destination_chains:接收一个Mapping[str, LLMChain] 字典,key为可以路由到的destination chain的名称,value为该destination chain的LLMChain实例
此外,还有其他主要的可选参数:
- memory: 接收一个BaseMemory实例,能为路由链添加上下文记忆
- verbose: bool值,若为True则会打印该链的调用过程
4.代码示例
下面我们以“园丁” 和 “插花大师”为例,子链DestinationChain分别是 园丁的chain
和 插花大师的chain
《代码流程》
1.【Step1】初始化语言模型("qwen:7b")
2.【Step2】构建提示信息(json格式),包括:key、description 和 template
- 【Step2.1】构建两个场景的模板
- 【Step2.2】构建提示信息
3.【Step3】构建目标链chain_map(json格式),以提示信息prompt_infos中的key为key,以Chain为value
4.【Step4】构建路由链router_chain
5.【Step5】构建默认链 default_chain
6.【Step6】构建多提示链 MultiPromptChain
from langchain.chains.llm import LLMChain
from langchain.prompts import PromptTemplate
from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE as RounterTemplate
## 【Step1】初始化语言模型
# from langchain.llms import OpenAI
# llm = OpenAI()
# llm = AzureChatOpenAI(deployment_name="GPT-4", temperature=0)
ollama_llm = Ollama(model="qwen:7b")
## 【Step2】构建提示信息(json格式),包括:key、description 和 template
# 【Step2.1】构建两个场景的模板
flower_care_template = """
你是一个经验丰富的园丁,擅长解答关于养花育花的问题。
下面是需要你来回答的问题:
{input}
"""
flower_deco_template = """
你是一位网红插花大师,擅长解答关于鲜花装饰的问题。
下面是需要你来回答的问题:
{input}
"""
# 【Step2.2】构建提示信息
prompt_infos = [
{
"key": "flower_care",
"description": "适合回答关于鲜花护理的问题",
"template": flower_care_template,
},
{
"key": "flower_decoration",
"description": "适合回答关于鲜花装饰的问题",
"template": flower_deco_template,
}
]
## 【Step3】构建目标链chain_map(json格式),以提示信息prompt_infos中的key为key,以Chain为value
chain_map = {}
for info in prompt_infos:
prompt = PromptTemplate(
template=info['template'],
input_variables=["input"]
)
print("目标提示:\n", prompt)
chain = LLMChain(
llm=ollama_llm,
prompt=prompt,
verbose=True
)
chain_map[info["key"]] = chain
## 【Step4】构建路由链router_chain
destinations = [f"{p['key']}: {p['description']}" for p in prompt_infos]
router_template = RounterTemplate.format(destinations="\n".join(destinations))
print("路由模板:\n", router_template)
router_prompt = PromptTemplate(
template=router_template,
input_variables=["input"],
output_parser=RouterOutputParser(),
)
print("路由提示:\n", router_prompt)
router_chain = LLMRouterChain.from_llm(
ollama_llm,
router_prompt,
verbose=True
)
## 【Step5】构建默认链 default_chain
from langchain.chains import ConversationChain
default_chain = ConversationChain(
llm=ollama_llm,
output_key="text",
verbose=True
)
## 【Step6】构建多提示链 MultiPromptChain
from langchain.chains.router import MultiPromptChain
chain = MultiPromptChain(
router_chain=router_chain,
destination_chains=chain_map,
default_chain=default_chain,
verbose=True
)
# 测试1
print(chain.run("如何为玫瑰浇水?"))
【参考链接】
- 【LangChain系列 31】Chains——基础链:LLMChain和RouterChain
- Langchain Chain - RouterChain 根据输入相关性进行路由的路由链
- 精华笔记:吴恩达 x LangChain《基于LangChain的大语言模型应用开发》(上)