The LangChain 框架有不同类型的链,包括 路由器链. 路由器链S允许从给定输入的一组链中动态选择预定义的链. 在这篇博客中,我们将探讨如何使用 路由器链s.
第二个 LangChain 我们在这个博客中讨论的话题是 回调. MultiPromptChain 和LangChain模型类支持回调,允许对某些事件做出反应,比如e.g. 接收到的响应 OpenAI 收到的模型或用户输入.
RouterChain示例流程
一个典型的 路由器链 基础工作流将接收一个输入,选择一个特定的 LLMChain 然后给出回应. 在这篇博客中,我们将探讨如何实现一个可以用下图表示的工作流:
这里执行了以下操作:
- 用户生成一个基于文本的输入.
- 输入通过回调写入文件.
- 路由器从五个选项中选择最合适的链:
- Python程序员
- Poet
——维基百科专家
-图形艺术家
-英国、美国法律专家 - 大型语言模型做出回应.
- 输出再次通过回调写入文件.
流程实现示例
我们已经使用Python作为一个简单的命令行应用程序实现了上面描述的工作流,它生成一个带有输出的HTML文件.
实现上面描述的工作流的代码在这个Git存储库中:
GitHub - gilfernandes/router_chain_playground:项目致力于探索…
项目致力于探索LLMRouterChain - GitHub - gilfernandes/router_chain_playground的功能:项目…
我们用了 Conda 环境,您可以使用以下命令设置:
Conda create——name langchain python=3.10
Conda install -c Conda -forge openai
Conda安装-c Conda -forge langchain
Conda install -c http://conda.anaconda.org/conda-forge prompt_toolkit
在运行脚本之前,请确保将' OPENAI_API_KEY '环境变量与OpenAI API Key一起添加.
脚本可以通过以下命令执行:
python ./ lang_chain_router_chain.py
例执行
Using “gpt-3.5 -涡轮- 0613“我们使用了以下输入,这些输入由指定的LLM链处理:
- 你能在Python中实现sigmoid函数和它的导数吗?
- python程序员 - 你能在Python中实现ReLU激活函数和它的衍生物吗?
- python程序员 - 你能用s型函数的输出生成一个图像吗?
- 图形艺术家 - 哪些激活函数在深度学习中常用?
- python程序员 - 你能给我写一首全球最大的博彩平台英国乡村计算机编程乐趣的诗吗?
- poet - 英国和美国法律体系的主要区别是什么?
- 法律专家 - 你能给我解释一下量子计算中量子比特的概念吗?
- 维基百科的专家
这是一个 成绩单 与模型的交互.
实现细节
我们创建了两个脚本:
主要脚本是 lang_chain_router_chain.py 文件写入回调的实现是 FileCallbackHandler.py.
主脚本 lang_chain_router_chain.py 执行三个步骤:
- 定义一个带有相应提示符的LLMChain列表
def generate_destination_chains ():
"""
创建具有不同提示模板的LLM链列表.
"""
prompt_factory = PromptFactory()
Destination_chains = {}
对于prompt_factory中的p_info.prompt_infos:
Name = p_info[' Name ']
Prompt_template = p_info[' Prompt_template ']
chain = LLMChain()
llm=cfg.llm,
提示= PromptTemplate(模板= prompt_template input_variables =(“输入”)))
Destination_chains [name] = chain
default_chain = ConversationChain(llm=cfg).llm output_key =“文本”)
返回prompt_factory.prompt_info, destination_chains, default_chain
提示信息在脚本的这一部分:
类PromptFactory ():
developer_template = ""你是一个非常聪明的Python程序员. \
为Python中的算法和计算机问题提供答案. \
您以详细的方式解释代码. \
这里有一个问题:
{输入}”“”
poet_template = """你是一个用英文诗歌回应创造性要求的诗人. \
你提供的答案是拜伦勋爵或莎士比亚风格的诗歌. \
这里有一个问题:
{输入}”“”
wiki_template = """你是维基百科专家. \
你回答基于维基百科知识的常识问题. \
你的解释既详细又通俗易懂.
这里有一个问题:
{输入}”“”
image_creator_template = """您创建了一个图像创建器. \
您可以使用SVG图像提供答案的图形表示.
这里有一个问题:
{输入}”“”
legal_expert_template = """你是英国或美国的法律专家. \
你用通俗易懂的语言解释与英国或美国法律制度有关的问题
有很多例子.
这里有一个问题:
{输入}”“”
prompt_info = [
{
'name': 'python程序员',
'description': '适合问全球最大的博彩平台编码和算法的问题',
“prompt_template”:developer_template
},
{
“名称”:“诗人”,
“description”:“适合为创造性问题创作诗歌”;
“prompt_template”:poet_template
},
{
'name': 'wikipedia专家';
description:“很适合回答全球最大的博彩平台一般知识的问题”;
“prompt_template”:wiki_template
},
{
'name': '图形艺术家';
'description': '适合回答需要图像输出的问题',
“prompt_template”:image_creator_template
},
{
'name': '法律专家';
description:“擅长回答与英国或美国法律相关的问题”;
“prompt_template”:legal_expert_template
}
]
- 从目的链和默认链生成路由器链.
Def generate_router_chain(prompt_info, destination_chains, default_chain):
"""
根据提示信息生成路由器链.
:param prompt_info上面生成的提示信息.
:param destination_chains使用不同提示模板的LLM链
default_chain默认链
"""
目的地= [f"{p['name']}: {p['description']}" for p in prompt_info]
Destinations_str = '\n'.十大正规博彩网站评级(目的地)
router_template = MULTI_PROMPT_ROUTER_TEMPLATE.格式(目的地= destinations_str)
router_prompt = PromptTemplate(
模板= router_template,
input_variables =(“输入”),
output_parser = RouterOutputParser ()
)
router_chain = LLMRouterChain.from_llm (cfg.llm router_prompt)
返回MultiPromptChain (
router_chain = router_chain,
destination_chains = destination_chains,
default_chain = default_chain,
verbose = True,
回调函数= [file_ballback_handler]
)
- 循环遍历用户输入,这样可以保存输出.
而真正的:
问题=提示;
HTML("Type Your question ('q' to exit, 's' to save to html file): ")
)
如果question == 'q':
break
如果question == 's':
file_ballback_handler.create_html ()
continue
结果=链.运行(提问)
打印(结果)
print()
The FileCallbackHandler.py 覆盖 langchain.回调.base.BaseCallbackHandler.
它实现了
def on_chain_end(self, outputs: Dict[str, Any], **kwargs: Any) -> None:
def on_text(self,text: str, color: Optional[str] = None, end: str = "", **kwargs: Any) -> None:
捕获LLM输出和用户输入.
它还提供了一个生成HTML文件的方法:
def create_html(自我)
结论
LangChain提供了方便的抽象 路由用户输入 到专业化链条. 从某种意义上说,你可以制作带有不同“帽子”的链条,这些“帽子”是根据它们的专业化而选择的.
此外,LangChain也有一个 强大的回拨系统 这样你就可以对锁链引发的内部事件做出反应.