在本文中,我们将使用 LangChain 和 OpenAI 创建一个针对特定案例构建的聊天机器人。如果您刚刚了解LLM或对它知之甚少,那么您来对地方了。本文对于初学者也是易于了解。
本套系列是由三部分组成的,这是第一部分。在本文中,我们将从为特定案例创建聊天机器人开始,然后在第二个教程中继续构建应用程序,最后学习如何将其与外部数据进行链接。
试想一下,假如您刚刚开始从事销售冰淇淋的业务,并想了解有关冰淇淋的相关信息(您的理想客户、独特的口味组合、简单的冰淇淋配方等)。我们可以使用 LangChain 和 OpenAI 的文本补全模型开发我们的聊天机器人。什么是LangChain?,LangChain是一个框架,通过提供足够的抽象,可以更轻松地使用大型语言模型构建应用程序。
环境设置
我更喜欢为每个项目设置一个新的 Conda 环境。如果您不熟悉 Conda,还可以在您选择的 IDE 中设置虚拟环境。在接下来的步骤中,我将详细介绍如何创建新的 Conda 环境、激活它以及在环境中安装所有必要的库。
python
conda create --name chatbot_langchain python=3.10
输入以下命令来激活您的环境
python
conda activate chatbot_langchain
现在,您已经创建了特定于此项目的新 Conda 环境,请继续安装所有必需的依赖项。激活环境后,可以在同一终端中使用以下命令来执行此操作。
python
pip install -r requirements.txt
这是requirements.txt文件的内容
python
langchain==0.1.1
openai==1.9.0
nbconvert
python-dotenv==1.0.0
langchain-openai
chainlit
uvicorn==0.25.0
Flask==3.0.1
现在,我们已经准备好开始为聊天机器人来编写代码了。
开始实施
步骤1:
首先,我们将创建一个简单的提示来查询我们的大型语言模型。在此示例中,我们将使用 OpenAI 的文本补全模型,特别是 gpt-3.5-turbo-instruct。对于这个项目,我们要构建一个聊天机器人,它将帮助用户回答任何与冰淇淋相关的问题。用户可以向机器人询问与冰淇淋有关的任何问题(冰淇淋口味组合、食谱,甚至冰淇淋笑话)。但是,我们不希望我们的聊天机器人回答与冰淇淋无关的问题。所以,我们可以将所有这些指令编写到我们的提示中。
为了保持代码库的模块化,我们将创建一个新的 python 脚本 prompts.py 来存放我们所有的提示。然后,您可以将提示传递给 LangChain 中的提示模板,并将其导入到您的主脚本中。可以将 PromptTemplate 视为提示的包装器,您可以在其中指定输入变量以及任何其他关键的信息。
python
from langchain.prompts import PromptTemplate
下面是我们的提示指令,来告诉聊天机器人它应该做什么。
python
ice_cream_assistant_template = """
You are an ice cream assistant chatbot named "Scoopsie". Your expertise is
exclusively in providing information and advice about anything related to ice creams. This includes flavor combinations, ice cream recipes, and general
ice cream-related queries. You do not provide information outside of this
scope. If a question is not about ice cream, respond with, "I specialize only in ice cream related queries."
Question: {question}
Answer:"""
ice_cream_assistant_prompt_template = PromptTemplate(
input_variables=["question"],
template=ice_cream_assistant_template
)
我把我们的冰淇淋助手命名为Scoopsie,您可以根据自己的喜好任何名称或不命名任何名称。自定义聊天机器人通常会被赋予一个名称,这也有助于我们在查询模型时验证提示。当您查询聊天机器人询问它的名字时,它应该说它是 Scoopsie。同样,如果你问它一些与冰淇淋无关的事情,它应该说它不知道答案。
步骤2:
在本教程中,我们将使用 OpenAI 的 gpt 3.5 模型。您可以在 OpenAI 上注册并获取自己的密钥来开始调用 gpt 模型。获得密钥后,在项目中创建一个文件并存储 OpenAI 密钥。.env
python
OPENAI_API_KEY="your_unique_key_goes_here"
在本教程中,我们将使用 python-dotenv 库来访问此密钥。Python-dotenv 从文件中读取键值对,并可以将它们设置为环境变量。该库已从环境设置中安装在 conda 或 virtualenv 中。在主 python 脚本中,您需要从库中调用以下函数:
python
from dotenv import load_dotenv
load_dotenv()
步骤3:
下一组代码将组装在一个名为 chatbot.py 的新 python 脚本中。这是我们的主要脚本,用于与模型进行交互。但是,为了便于理解,我已将其分解为更小的组件,我将在接下来的几个步骤中解释这些组件。首先,我们将创建一个 OpenAI 类的实例,该实例配置为使用具有特定温度值的特定模型。
python
from langchain_openai import OpenAI
llm = OpenAI(model='gpt-3.5-turbo-instruct', temperature=0.7)
在 2024 年 1 月 4 日的更新之后,OpenAI 弃用了许多模型,并用新模型取而代之。即使您使用的是旧版本的 LangChain 库,也要确保使用函数模型。在实例化过程中,我们定义了模型名称,并设置了一个温度值。在像OpenAI这样的大型语言模型中,"温度"控制着文本生成的随机性。低温(0 到 0.5)会产生可预测的确定性文本,而高温(高于 1.0)会增加创造力和不可预测性。介于 0.5 和 1.0 之间的值是随机性和可预测性之间的良好平衡。
步骤4:
接下来,我们需要创建一个 LLM 链。在LangChain中,LLM链代表了与语言模型交互的更高层次的抽象。虽然我们可以在简单的聊天机器人中使用直接的 LLM 界面,但 LLMChain 界面包装了 LLM 以添加其他功能。有了链,我们可以进行提示格式化和输入/输出解析,并且它们被更高级别的 LangChain 工具广泛使用。对于我们的简单聊天机器人,我们将使用 LLMChain,并将我们创建的模型对象与我们的冰淇淋助手提示模板一起传递给它。
python
from langchain.chains import LLMChain
llm_chain = LLMChain(llm=llm, prompt=ice_cream_assistant_prompt_template)
步骤5:
此时,我们的简单聊天机器人的代码基本完整。我们只需要为我们的脚本(也称为 main 函数)创建一个入口点。我们还需要能够查询我们的模型。这是使用带有 llm_chain 对象的 invoke 函数完成的。将我们到目前为止所做的一切放在我们的 chatbot.py 脚本中,你会得到如下所示的内容:
python
from langchain_openai import OpenAI
from langchain.chains import LLMChain
from prompts import ice_cream_assistant_prompt_template
from dotenv import load_dotenv
load_dotenv()
llm = OpenAI(model='gpt-3.5-turbo-instruct', temperature=0.7)
llm_chain = LLMChain(llm=llm, prompt=ice_cream_assistant_prompt_template)
def query_llm(question):
print(llm_chain.invoke({'question': question})['text'])
if __name__ == '__main__':
query_llm("Who are you?")
测试和验证
现在,让我们来测试机器人。到目前为止,我们还没有将任何内存集成到我们的机器人中,因此每个查询都必须是它自己的函数调用。具体来说,在测试任何 llm 应用程序/机器人时,我喜欢从几个基本问题开始。
python
if __name__ == '__main__':
question = "Who are you?"
query_llm(question)
python
if __name__ == '__main__':
question = "What is 2+2?"
query_llm(question)
python
question = "I need chocolate ice-cream recipe"
print(llm_chain.invoke({'question': question})['text'])
后续步骤
我们针对特定案例的简单聊天机器人现已准备就绪。在下一教程中,我们将重点介绍如何将历史记录组件集成到机器人中,以便我们的应用程序类似于对话流,而不是独立的查询,以及创建应用程序。