10LangChain实战课 - 构建智能客服ChatBot

73 阅读5分钟

LangChain实战课 - 构建智能客服ChatBot

我正在参加「豆包MarsCode AI练中学体验活动」详情请看:掘金小册上线 AI练中学功能 | 你的 AI 编程助教喊你免费领小册啦!

在本次LangChain实战课程中,我们深入学习了如何构建一个能够处理鲜花养护和装饰问题的智能客服ChatBot。以下是本次课程的核心内容和步骤:

1. 任务设定

我们的目标是构建一个智能客服系统,能够区分并处理两大类问题:鲜花养护和鲜花装饰。系统将根据问题类型,自动将问题分配给相应的ChatBot(A或B)。

2. 整体框架

我们使用了RouterChain(路由链)来动态选择下一个链。RouterChain根据用户问题内容,确定问题更适合哪个处理模板,然后将问题发送到相应的处理模板进行回答。如果问题不适合任何已定义的处理模板,它会被发送到默认链。

3. 构建处理模板

我们为鲜花护理和鲜花装饰分别定义了两个字符串模板,这些模板将作为语言模型回答问题的指导。

flower_care_template = """你是一个经验丰富的园丁,擅长解答关于养花育花的问题。
                        下面是需要你来回答的问题:
                        {input}"""

flower_deco_template = """你是一位网红插花大师,擅长解答关于鲜花装饰的问题。
                        下面是需要你来回答的问题:
                        {input}"""

4. 提示信息

我们使用一个列表来组织和存储这两个处理模板的关键信息,包括模板的键、描述和实际内容。

prompt_infos = [
    {
        "key": "flower_care",
        "description": "适合回答关于鲜花护理的问题",
        "template": flower_care_template,
    },
    {
        "key": "flower_decoration",
        "description": "适合回答关于鲜花装饰的问题",
        "template": flower_deco_template,
    }
]

5. 初始化语言模型

我们导入并实例化了语言模型,这里使用的是OpenAI。

from langchain.llms import OpenAI
import os
os.environ["OPENAI_API_KEY"] = '你的OpenAI Key'
llm = OpenAI()

6. 构建目标链

我们根据提示信息中的每个模板构建了对应的LLMChain,并存储在一个字典中。

from langchain.chains.llm import LLMChain
from langchain.prompts import PromptTemplate
chain_map = {}
for info in prompt_infos:
    prompt = PromptTemplate(template=info['template'], input_variables=["input"])
    chain = LLMChain(llm=llm, prompt=prompt, verbose=True)
    chain_map[info["key"]] = chain

7. 构建LLM路由链

LLMRouterChain是决策的核心部分,它根据提示信息构建了一个路由模板,并使用这个模板创建了一个LLMRouterChain。

from langchain.chains.router.llm_router import LLMRouterChain, RouterOutputParser
from langchain.chains.router.multi_prompt_prompt import MULTI_PROMPT_ROUTER_TEMPLATE as RouterTemplate
destinations = [f"{p['key']}: {p['description']}" for p in prompt_infos]
router_template = RouterTemplate.format(destinations="\n".join(destinations))
router_prompt = PromptTemplate(template=router_template, input_variables=["input"], output_parser=RouterOutputParser())
router_chain = LLMRouterChain.from_llm(llm, router_prompt, verbose=True)

8. 构建默认链

如果输入不适合任何已定义的处理模板,这个默认链会被触发。

from langchain.chains import ConversationChain
default_chain = ConversationChain(llm=llm, output_key="text", verbose=True)

9. 构建多提示链

使用MultiPromptChain将LLM路由链、目标链和默认链组合在一起,形成一个完整的决策系统。

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

10. 运行路由链

最后,我们通过提出各种问题来测试我们的链,确保它们能够正确地将问题路由到相应的目标链。

通过本次课程,我们学习了如何使用LangChain框架来构建一个智能客服系统,这个系统能够根据用户的问题动态选择最合适的处理链,从而提供更加精准的服务。这种技术的应用不仅可以提高客服效率,还可以提升用户体验。希望这些笔记能帮助你更好地理解和应用LangChain框架。 你好,黄佳!看起来你正在教授一个关于LangChain实战课程的内容,这个课程涉及到了如何使用LangChain框架来构建智能客服ChatBot,并且处理不同类型的问题。你提供的课程内容非常详细,涉及到了构建处理模板、初始化语言模型、构建目标链、构建路由链、构建默认链以及构建多提示链等多个步骤。

思考题

  1. 通过verbose=True这个选项的设定,在输出时显示了链的开始和结束日志,从而得到其相互调用流程。请你尝试把该选项设置为False,看一看输出结果有何不同。
  2. 在这个例子中,我们使用了ConversationChain作为default_chain,这个Chain是LLMChain的子类,你能否把这个Chain替换为LLMChain?

思考题解答

  1. verbose=True/False的影响

    • verbose=True:当设置为True时,LangChain会在执行过程中输出额外的日志信息,这些日志信息可以帮助开发者了解链的执行流程和状态,包括链的开始和结束。这对于调试和理解链的内部工作机制非常有用。
    • verbose=False:当设置为False时,这些额外的日志信息将不会被输出,输出结果会更加简洁,只包含最终的执行结果。这在生产环境中或者当不需要关注链的内部执行细节时非常有用。

    尝试将verbose设置为False后,你将发现输出结果中不再包含链的开始和结束日志,只有最终的输出结果。

  2. 将ConversationChain替换为LLMChain作为default_chain

    • ConversationChainLLMChain的子类,它继承了LLMChain的所有功能,并可能添加了一些特定于对话的功能。如果ConversationChain中没有添加对默认链处理逻辑的特殊需求,理论上是可以将其替换为LLMChain的。但是,如果ConversationChain中实现了一些特定的逻辑,比如对话管理或者特定的输出格式,那么直接替换可能会影响ChatBot的功能。

    在替换之前,需要检查ConversationChain的具体实现,确保没有丢失重要的功能。如果ConversationChain仅仅是LLMChain的一个简单包装,那么替换应该是可行的。

通过这个课程,我们学习了如何使用LangChain框架来构建一个智能客服系统,这个系统能够根据用户的问题动态选择最合适的处理链,从而提供更加精准的服务。这种技术的应用不仅可以提高客服效率,还可以提升用户体验。