langchain 入门指南 - 自动选择不同的大模型

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: langchain 入门指南 - 自动选择不同的大模型

自动选择不同的大模型

在先前的文章中,我们学会了可以让 Agent 自动选择不同的工具来处理不同的问题。

在现实场景中,我们可能还会面临另外一种场景是,使用不同的大模型来处理用户的问题,

比如根据用户输入的不同问题选择使用 OpenAI 或者是本地部署的大模型。

RouterChain

为了解决这个问题,langchain 引入了 RouterChain,它是一个可以自动选择不同大模型(实际上是 chain)的工具。

比如我们有两个大模型,一个是 OpenAI 的 GPT-3.5,擅长解答关于 Python 的问题;另一个是 OpenAI 的 gpt-4,擅长解答关于 Golang 的问题。

我们可以根据用户的输入来选择是使用 GPT-3.5 还是 GPT-4 来回答用户的问题。

比如:

  1. 输入:“python 如何写入文件”,那么选择的应该是 GPT-3.5。
  2. 输入:“Golang 中如何启动协程”,那么选择的应该是 GPT-4。

整体框架

RouterChain,也叫路由链,能动态选择用于给定输入的下一个链。我们会根据用户的问题内容,首先使用路由链确定问题更适合哪个处理模板,

然后将问题发送到该处理模板进行回答。如果问题不适合任何已定义的处理模板,它会被发送到默认链。

在这里,我们会使用 LLMRouterChainMultiPromptChain(也是一种路由链)组合实现路由功能,

MultiPromptChain 会调用 LLMRouterChain 选择与给定问题最相关的提示,然后使用该提示回答问题。

具体步骤如下:

  1. 构建处理模板:为 “解答 python 问题” 和 “解答 Golang 问题” 分别构建一个目标链(LLMChain),并存储在一个字典中。
  2. 构建 LLM 路由链:这是决策的核心部分。首先,它根据提示信息构建了一个路由模板,然后使用这个模板创建了一个 LLMRouterChain
  3. 构建默认链:如果输入不适合任何已定义的处理模板,这个默认链会被触发。
  4. 构建多提示链:使用 MultiPromptChainLLMRouterChain 和默认链组合在一起,形成一个完整的决策系统。

具体实现

先定义两个 LLMChain

下面是两个 LLMChain 的定义,一个是用于回答 Python 问题的,另一个是用于回答 Golang 问题的。

from langchain.chains.llm import LLMChain
from langchain_community.llms import OpenAI
from langchain_core.prompts import PromptTemplate
# 创建一个 GPT-3.5 的 LLMChain
def create_py_chain() -> LLMChain:
    prompt_template = """
    你是一名 Python 工程师,擅长解答关于 Python 编程的问题。
    下面是需要你来回答的问题:
    {input}
    """
    prompt = PromptTemplate(
        template=prompt_template,
        input_variables=["input"],
    )
    llm = OpenAI()
    return LLMChain(llm=llm, prompt=prompt, verbose=True)
# 创建一个 GPT-4 的 LLMChain
def create_go_chain() -> LLMChain:
    prompt_template = """
    你是一名 Golang 工程师,擅长解答关于 Golang 编程的问题。
    下面是需要你来回答的问题:
    {input}
    """
    prompt = PromptTemplate(
        template=prompt_template,
        input_variables=["input"],
    )
    llm = OpenAI()
    return LLMChain(llm=llm, prompt=prompt, verbose=True)
# 创建两个 LLMChain
chain_map = {
    "Python": create_py_chain(),
    "Golang": create_go_chain(),
}

定义一个 RouterChain

RouterChain 是一个可以自动选择不同大模型(实际上是 chain)的工具。

from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE
destinations = [
    "Python: 适合回答关于 Python 编程的问题",
    "Golang: 适合回答关于 Golang 编程的问题",
]
router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(destinations="\n".join(destinations))
router_prompt = PromptTemplate(
    template=router_template,
    input_variables=["input"],
    output_parser=RouterOutputParser(),
)
router_chain = LLMRouterChain.from_llm(
    llm=OpenAI(),
    prompt=router_prompt,
    verbose=True
)

这其实是本文关键的地方,router_prompt 实际上是一个 Prompt

  • 其中 input_variables 是输入的变量,这里只有一个 input
  • output_parser 是输出解析器,这里使用了 RouterOutputParser
  • template 是一个模板,用于生成提示。

简而言之,这个 RouterChain 允许你将用户的输入送入路由器,然后路由器会决定将该输入发送到哪个具体的模型,或者是否需要对输入进行修订以获得最佳的响应。

定义一个默认 chain

如果输入不适合任何已定义的 chain,这个默认 chain 会被使用。

default_chain = ConversationChain(llm=OpenAI(), output_key="text", verbose=True)

定义一个 MultiPromptChain

MultiPromptChain 根据用户输入尝试选择一个 destination_chains 中的 chain 来处理问题。

如果没有找到合适的 chain,会使用 default_chain 来处理问题。

from langchain.chains.router import MultiPromptChain
chain = MultiPromptChain(
    router_chain=router_chain,
    default_chain=default_chain,
    destination_chains=chain_map,
    verbose=True
)

MultiPromptChain 有三个关键元素:

  1. router_chain(类型 RouterChain):这是用于决定目标链和其输入的链。当给定某个输入时,这个 router_chain 决定哪一个 destination_chain 会被使用,以及传给它的具体输入是什么。
  2. destination_chains(类型 Mapping[str, LLMChain]):这是一个映射,将名称映射到可以将输入路由到的候选链。例如,你可能有多种处理文本数据的方法(或 “链”),每种方法针对特定类型的问题。
  3. default_chain(类型 LLMChain):当 router_chain 无法将输入映射到 destination_chains 中的任何链时,LLMChain 将使用此默认链。

它的工作流程如下:

  1. 输入首先传递给 router_chain
  2. router_chain 根据某些标准或逻辑决定应该使用哪一个 destination_chain
  3. 输入随后被路由到选定的 destination_chain,该链进行处理并返回结果。
  4. 如果 router_chain 不能决定正确的 destination_chain,则输入将被传递到 default_chain

这样,MultiPromptChain 就为我们提供了一个在多个处理链之间动态路由输入的机制,以得到最相关或最优的输出。

调用

下面是一个调用的例子:

print(chain.invoke({"input": "如何在 Python 中定义一个函数?"}))

这会使用 Python 的 LLMChain 来回答这个问题。

我们会看到有类似如下的输出:

Prompt after formatting:
    你是一名 Python 工程师,擅长解答关于 Python 编程的问题。
    下面是需要你来回答的问题:
    如何在 Python 中定义一个函数?

原理

本质上,其实是在 RouterChain 中定义了一个 Prompt,让 LLM 来判断分析使用哪一个 destination_chain

我们可以打印一下看看:

print(router_prompt.format(input="如何在 Python 中定义一个函数?"))

输出如下:

Given a raw text input to a language model select the model prompt best suited for the input. 
You will be given the names of the available prompts and a description of what 
the prompt is best suited for. You may also revise the original input if you 
think that revising it will ultimately lead to a better response from the language model.
<< FORMATTING >>
Return a markdown code snippet with a JSON object formatted to look like:
```json
{
    "destination": string \ name of the prompt to use or "DEFAULT"
    "next_inputs": string \ a potentially modified version of the original input
}
```
REMEMBER: "destination" MUST be one of the candidate prompt names specified below OR it 
can be "DEFAULT" if the input is not well suited for any of the candidate prompts.
REMEMBER: "next_inputs" can just be the original input if you don't think any modifications are needed.
<< CANDIDATE PROMPTS >>
Python: 适合回答关于 Python 编程的问题
Golang: 适合回答关于 Golang 编程的问题
<< INPUT >>
如何在 Python 中定义一个函数?
<< OUTPUT (must include ```json at the start of the response) >>
<< OUTPUT (must end with ```) >>

这个 Prompt 包含了如下内容:

  1. 先是一个简单的引导语句,告诉模型你将给它一个输入,它需要根据这个输入选择最适合的模型。
  2. 进一步提醒模型,它将获得各种模型提示的名称和描述。同时告诉模型,还有一个可选的步骤,它可以更改原始输入,以便最终获得更好的响应。
  3. 接下来是格式说明:指导模型如何格式化其输出,使其以特定的方式返回结果:表示模型的输出应该是一个 Markdown 格式,其中包含一个 JSON 对象。然后指定了 JSON 的格式。
  4. 额外的说明和要求:告诉模型,如果输入不适合任何候选提示,则应该返回 DEFAULT
  5. 候选提示:列出了所有可用的模型及其描述。
  6. 输入:给出了一个示例输入。

这个模板的目的是让模型知道如何处理用户的输入,并根据提供的提示列表选择一个最佳的模型提示来回应。

总结

RouterChain 是一个可以自动选择不同大模型(实际上是 chain)的工具,可以根据用户的输入来选择使用不同的大模型来回答用户的问题。


相关实践学习
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
2月前
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
791 1
|
2月前
|
人工智能 Java API
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
本文介绍AI大模型的核心概念、分类及开发者学习路径,重点讲解如何选择与接入大模型。项目基于Spring Boot,使用阿里云灵积模型(Qwen-Plus),对比SDK、HTTP、Spring AI和LangChain4j四种接入方式,助力开发者高效构建AI应用。
1164 122
AI 超级智能体全栈项目阶段一:AI大模型概述、选型、项目初始化以及基于阿里云灵积模型 Qwen-Plus实现模型接入四种方式(SDK/HTTP/SpringAI/langchain4j)
|
2月前
|
敏捷开发 人工智能 自动驾驶
AI大模型入门第四篇:借助RAG实现精准用例自动生成!
测试开发是否总被用例维护、漏测风险和文档滞后困扰?RAG技术让AI实时解读最新需求,自动生成精准测试用例,动态对齐线上数据,节省70%维护成本,助你告别手工“填坑”,高效应对需求变化。
|
2月前
|
机器学习/深度学习 人工智能 API
新手入门需要掌握多少种大模型才行
新手学大模型,重在掌握一类而非贪多。聚焦通用技能:提示词、思维链、API调用与模型评估。应用开发者精研1个闭源(如GPT)+1个开源(如Llama 3);研究者深入基座模型原理。少即是多,先精通再迁移,用框架(如LangChain)实现模型自由切换。目标是会用工具,而非背诵所有模型。
|
3月前
|
人工智能 JavaScript 前端开发
​​大模型开发从入门到部署
本内容系统讲解大语言模型技术,涵盖BERT、GPT等主流架构,深入Transformer原理与自注意力机制,结合PyTorch实战,详解张量操作、自动求导与模型训练,并介绍RAG、Agent等典型应用场景,助你掌握AI核心技术。
210 0
|
5月前
|
人工智能 数据库
智能体(AI Agent)开发实战之【LangChain】(四)结合大模型基于RAG实现本地知识库问答和纠错
本文介绍如何基于RAG实现知识库问答系统的输入内容纠错功能。通过加载本地知识库、构建向量数据库,结合大语言模型对输入文本进行检索比对与纠错优化,提升问答准确性。
|
5月前
|
数据采集 存储 人工智能
智能体(AI Agent)开发实战之【LangChain】(二)结合大模型基于RAG实现本地知识库问答
智能体(AI Agent)开发实战之【LangChain】(二)结合大模型基于RAG实现本地知识库问答

热门文章

最新文章