【langchain小实践】 链组件之路由链

这篇实践指南将向您展示如何使用Python和OpenAI的GPT-3.5模型来创建一个简单的问答系统。这个系统能够根据问题的不同领域,如物理、数学、历史和计算机科学,自动选择最合适的专家来回答。

我们将通过以下步骤来实现这个系统:

1. 环境准备

首先,确保您已经安装了langchain库,这是一个用于构建和运行基于语言模型的应用程序的框架。如果您还没有安装,可以通过pip install langchain来安装。

2. 获取OpenAI API密钥

您需要一个OpenAI API密钥来使用GPT-3.5模型。如果您还没有,可以访问OpenAI官网注册并获取您的API密钥。

3. 设置环境变量

在您的项目目录中创建一个.env文件,用于存储您的OpenAI API密钥。例如:

plaintext 复制代码
OPENAI_API_TOKEN=your_openai_api_key_here

4. 创建Python脚本

创建一个新的Python脚本文件,例如multi_chain_qa.py,并导入所需的库和模块。

5. 初始化OpenAI模型

在脚本中,首先加载环境变量中的API密钥,并创建一个OpenAI模型实例。

python 复制代码
from langchain.llms.openai import OpenAI
import os
from dotenv import load_dotenv

load_dotenv()
api_key = os.getenv('OPENAI_API_TOKEN')

llm = OpenAI(temperature=0, model="gpt-3.5-turbo-instruct",
             api_key=api_key, max_tokens=1000)

6. 创建提示模板

接下来,定义四个不同的提示模板,分别对应物理、数学、历史和计算机科学领域,并整合到一个列表 prompt_infos 中:

python 复制代码
physics_template = """
    你是一位非常聪明的物理教授。\
    你擅长以简洁易懂的方式回答有关物理方面的问题。\
    当你不知道某个问题的答案时,你会坦率承认自己不知道。
    这是我的问题:
    {input}"""

math_template = """
    你是一个非常优秀的数学家。\
    你擅长回答数学问题。\
    你之所以如此出色,是因为能够将难题拆解成简单部分,\
    回答这些简单部分,然后将它们组合起来就能解决难题。
    这是我的问题:
    {input}"""

history_template = """
    你是一位非常优秀的历史学家。\
    你对于各个历史时期的人物、事件和背景有着卓越的知识和理解能力。\
    你具备思考、反思、辩论、讨论和评估历史的能力。\
    你尊重历史证据,并且有能力利用它来支持自己的解释和判断。
    这是我的问题:
    {input} """

computerscience_template = """
    你是一位成功的计算机科学家。\
    你有创造力、懂协作、有前瞻性、有技术问题解决能力、你有对理论和算法的理解以及出色的沟通技巧 \
    你充满热情。你擅长回答编码问题,\
    因为你知道如何通过描述可由机器轻松解释的命令步骤来解决问题并提供一个在各方面较为平衡的方案。
    这是我的问题:
    {input}"""
    
prompt_infos = [
    {
        "name": "physics",
        "description": "适合回答物理问题",
        "prompt_template": physics_template
    },
    {
        "name": "math",
        "description": "适合回答数学问题",
        "prompt_template": math_template
    },
    {
        "name": "history",
        "description": "适合回答历史问题",
        "prompt_template": history_template
    },
    {
        "name": "computerscience",
        "description": "适合回答计算机科学问题",
        "prompt_template": computerscience_template
    }
]

7. 创建LLMChains

为每个领域创建一个LLMChain实例,并将其存储在一个字典中。

python 复制代码
destination_chains = {}
for p_info in prompt_infos:
    name = p_info["name"]
    prompt_template = p_info["prompt_template"]
    prompt = PromptTemplate.from_template(template=prompt_template)
    chain = LLMChain(llm=llm, prompt=prompt)
    destination_chains[name] = chain
destinations = [f"{p['name']}:{p['description']}" for p in prompt_infos]
destination_str = "\n".join(destinations)

8. 创建默认链

创建一个默认链,用于处理那些不匹配任何特定领域的输入。

python 复制代码
default_prompt = PromptTemplate.from_template("{input}")
default_chain = LLMChain(llm=llm, prompt=default_prompt)

9. 创建路由提示模板

首先,定义一个字符串变量MULTI_PROMPT_ROUTER_TEMPLATE

然后,转成PromptTemplate,同时指定输入参数的名字以及输出解析器(RouterOutputParser);

python 复制代码
MULTI_PROMPT_ROUTER_TEMPLATE = """将原始文本输入到语言模型中,\
   选择最适合该输入的提示词。\
   你将获得最适合的提示名称以及相应的描述\
   如果你认为修改原始输入会让语言模型有更好的响应结果,则可以进行修改。
   << FORMATTING >>
   返回一个 Markdown 代码片段,其中包含格式化为 JSON 对象的内容:
   ```json
   {{{{
       "destination":string \ 要使用的 prompt 名称,如果找不到则设置为 "DEFAULT"
       "next_inputs": string \ 原始的输入,或者可能是原始输入的修改版本
   }}}}
   ```

   记住:"destination"必须是下面指定的候选提示名称之一,或者如果输入不适合任何候选提示,则可以是"DEFAULT"
   记住:"next inputs"如果你认为不需要进行任何修改,可以直接使用原始输入。

   << CANDITATE PROMPTS >>
   {destinations}

   << INPUT >>
   {{ input }}

   << OUTPUT (记住要包含 ```json) >>
   """
   
router_template = MULTI_PROMPT_ROUTER_TEMPLATE.format(
   destinations=destination_str
)
router_prompt = PromptTemplate(
   template=router_template,
   input_variables=["input"],
   output_parser=RouterOutputParser()
)

10. 创建路由链

创建一个路由链,用于根据输入内容选择最合适的领域链,步骤如下:

初始化一个 LLMRouterChain 并配置好所用的 LLM 以及 Router_Prompt。 这时 LLMRouterChain 的作用就是将 input 输入路由到正确的PromptTemplate

注意:此时它只是帮你进行了选择,本身并不会进一步调用对应的 LLMChain。

python 复制代码
router_chain = LLMRouterChain.from_llm(llm, router_prompt)

11. 创建MultiPromptChain

最后,创建一个MultiPromptChain,它将根据路由链的结果将输入传递给相应的LLMChain。

python 复制代码
chain = MultiPromptChain(
    router_chain=router_chain,
    destination_chains=destination_chains,
    default_chain=default_chain,
    verbose=True
)

12. 运行问答系统

现在,您可以运行问答系统,向它提出问题,并获取答案。

python 复制代码
# print(chain.run("为什么秦始皇是嬴政"))
print(chain.run("1+1=?"))

13. 实践指南总结

通过上述实践指南,我们可以了解到langchain是一个强大的框架,它允许开发者利用OpenAI的GPT-3.5模型来构建复杂的问答系统。这个框架提供了一系列的工具和组件,如OpenAI类、PromptTemplateLLMChainLLMRouterChainMultiPromptChain,使得创建一个能够根据问题领域自动选择合适回答的系统变得简单。开发者可以通过定义不同的提示模板来训练模型,以适应物理、数学、历史和计算机科学等不同领域的知识。此外,langchain还支持环境变量的设置,使得API密钥的管理和使用更加安全。通过这些组件的组合,开发者可以构建一个能够理解用户输入并提供准确回答的智能问答系统。

相关推荐
2401_8581205310 分钟前
古典舞在线交流平台:SpringBoot设计与实现详解
java·spring boot·后端
赐你岁月如歌22 分钟前
如何使用ssm实现基于web的网站的设计与实现+vue
java·后端·ssm
潘多编程2 小时前
Spring Boot微服务架构设计与实战
spring boot·后端·微服务
2402_857589362 小时前
新闻推荐系统:Spring Boot框架详解
java·spring boot·后端
2401_857622662 小时前
新闻推荐系统:Spring Boot的可扩展性
java·spring boot·后端
江湖十年4 小时前
在 Go 中如何优雅的处理错误
后端·go
Amagi.4 小时前
Spring中Bean的作用域
java·后端·spring
侠客行03174 小时前
xxl-job调度平台之任务触发
java·后端·源码
2402_857589364 小时前
Spring Boot新闻推荐系统设计与实现
java·spring boot·后端
J老熊4 小时前
Spring Cloud Netflix Eureka 注册中心讲解和案例示范
java·后端·spring·spring cloud·面试·eureka·系统架构