开发一个聊天机器人#
在本教程中,您将学习如何使用Python构建一个简单的聊天机器人,该机器人利用Anaconda AI Navigator的内置API服务器来处理自然语言查询。您将使用conda建立一个工作环境来开发聊天机器人,从提供的代码片段中构建聊天机器人应用程序的API调用,在命令行中与聊天机器人交互,并查看API服务器日志以验证应用程序是否正常运行。
- Prerequisites
在开始之前,请确保您的机器上已安装conda包管理器。您可以使用Anaconda Distribution或Miniconda来安装
conda
。您必须在本地机器上下载一个
text-generation
类型的模型。在开始本教程之前,请先阅读Getting started with Anaconda AI Navigator指南。
设置您的环境#
在开始一个新的conda项目时,建议您为开发创建一个新的环境。按照以下步骤为您的聊天机器人设置环境:
打开Anaconda提示符(在macOS/Linux上是终端)。
提示
如果愿意,可以从IDE(JupyterLab、PyCharm、VSCode、Spyder)中打开此终端。
为您的聊天机器人开发创建conda环境,并通过运行以下命令安装您需要的包:
conda create --name chataconda python requests
通过运行以下命令激活您新创建的conda环境:
conda activate chataconda
有关管理环境的更多信息和最佳实践,请参阅Environments。
构建聊天机器人#
下面,您将找到构建聊天机器人所需的代码片段,以及每个片段的解释,以帮助您理解代码的功能。
使用您首选的IDE,在您的机器上创建一个新文件,并将其命名为chatter-max.py
。
导入库#
我们正在构建的应用程序很简单,所以我们只导入了requests
包,它使Python能够向API服务器发出HTTP请求并接收响应。
将此作为您的chatter-max.py
文件中的第一行代码:
import requests
设置base_url
#
为了使您的应用程序能够以编程方式处理自然语言输入以生成响应、运行服务器健康检查并执行其他操作,正确构建您的应用程序以与API服务器及其端点进行交互至关重要。
这些API端点的URL是通过将base_url
与每个函数的特定/endpoint
组合而成的。base_URL
可以通过组合Anaconda AI Navigator中指定的服务器地址和服务器端口来构建,如下所示:http://
。
通过将以下行添加到您的文件中,将base_url
设置为指向默认服务器地址。
base_url = 'http://localhost:8080'提示
localhost
和127.0.0.1
在语义上是相同的。
添加API调用#
本教程描述了最常见的API端点。有关API端点的完整列表以及如何有效使用它们的详细信息,请参阅官方的llama.cpp HTTP服务器文档。
为了使您的应用程序能够与API服务器通信,您必须实现以服务器可以理解的方式调用API的函数。
GET /health#
在向服务器发送任何请求之前,明智的做法是验证服务器是否正常运行。此函数向/health
端点发送GET请求,并返回一个JSON响应,告诉你服务器的状态。
将以下行添加到您的 chatter-max.py
文件中:
def get_server_health(): response = requests.get(f'{base_url}/health') return response.json()
POST /completion#
要与模型交互,您必须有一个函数来提示服务器的/completion
端点。此函数将用户输入发送到加载到API服务器中的模型,并接收生成的响应。
这里的提示构建提供了context
来设定模型如何响应用户的基调。本质上,这是对模型的初始提示,它为您的模型“设定了基调”。我们稍后会再次讨论这一点。
将User:
和Assistant:
的输入分别放在新行上,并通过各自的标签进行分隔,有助于模型区分对话的不同部分。如果没有这种区分,模型会假设用户希望它完成输入,而不是回应输入。
data
字典是一个结构化的参数集合,用于控制 AI 模型如何根据用户的输入生成响应。这些参数决定了模型在完成过程中的行为。它会被转换为 JSON 并作为请求的主体发送。
将以下行添加到您的 chatter-max.py
文件中:
def post_completion(context, user_input): prompt = f"{context}\nUser: {user_input}\nAssistant:" data = { 'prompt': prompt, 'temperature': 0.8, 'top_k': 35, 'top_p': 0.95, 'n_predict': 400, 'stop': ["</s>", "Assistant:", "User:"] } headers = {'Content-Type': 'application/json'} response = requests.post(f'{base_url}/completion', json=data, headers=headers) if response.status_code == 200: return response.json()['content'].strip() else: return "Error processing your request. Please try again."
每次交互后,您需要更新对话的上下文,以帮助模型生成连贯的对话。此函数通过追加最新的用户输入和助手的响应来更新context
的值,从而保持模型参与对话。
将以下行添加到您的 chatter-max.py
文件中:
def update_context(context, user_input, assistant_response): return f"{context}\nUser: {user_input}\nAssistant: {assistant_response}"
构建聊天功能#
main
函数启动聊天机器人,处理用户输入,并管理对话流程。这是您为 context
设置初始值的地方。
提示
尝试使用context
,看看它如何影响你从模型接收到的响应!
将以下行添加到您的 chatter-max.py
文件中:
def main(): context = "You are a friendly AI assistant designed to provide helpful, succinct, and accurate information." health = get_server_health() print('Server Health:', health) if health.get('status') == 'ok': while True: user_input = input("Enter a prompt or type 'exit' to quit: ") if user_input.lower() == 'exit': break assistant_response = post_completion(context, user_input) print('Assistant:', assistant_response) context = update_context(context, user_input, assistant_response) else: print("Server is not ready for requests.") if __name__ == "__main__": main()
与API服务器交互#
构建好你的聊天机器人后,是时候测试你的模型了!
打开Anaconda AI导航器并将模型加载到API服务器。
将服务器地址和服务器端口保留为默认值,然后点击 开始。
打开终端并导航到存储
chatter-max.py
文件的目录。通过运行以下命令启动聊天机器人:
python chatter-max.py
查看Anaconda AI Navigator API服务器日志。如果一切设置正确,服务器日志将填充来自您的聊天机器人应用程序的流量,从健康检查开始,然后是模型的初始
context
提示。
与模型一起玩得开心#
尝试调整/completion
端点的data
字典中的以下参数,看看它们如何影响模型的输出。
temperature
#
调整模型的温度可以增加或减少从提示中收到的响应的随机性。较高的值(例如1.0
)使输出更加自由流动和富有创意。较低的值(例如0.2
)使输出更加确定性和集中。默认值为0.8
。
top_k
#
限制top_k
参数将模型的响应限制在k
个最可能的标记上。减少可用标记的数量就像限制了模型在尝试猜测下一个单词时可以选择的范围。top_k
的默认值为40
。尝试将top_k
设置为更高或更低的值,看看模型对相同提示的响应如何变化。
top_p
#
限制令牌选择为累积概率高于阈值的令牌子集,以平衡创造性与连贯性。较高的值允许模型提供更具创造性的响应,而较低的值增强专注度。调整top_p
以查看它如何影响模型对相同提示的描述性。默认为0.95
。
stream
#
将 stream
设置为 true
以逐令牌查看模型的响应。默认情况下,流式传输设置为 false
。
下一步#
你可以继续开发和扩展这个聊天机器人,通过包含其他端点以实现更高级的用途——比如分词或槽位管理——或者你可以删除这个文件并通过运行以下命令来清理你的conda环境:
conda deactivate conda remove --name chataconda --all