开发聊天机器人#

在本教程中,您将学习构建一个简单的 Python 聊天机器人,该机器人利用 Anaconda AI Navigator 的内置 API 服务器来处理自然语言查询。您将使用 conda 建立一个工作环境来开发聊天机器人,从提供的代码片段构建聊天机器人应用程序的 API 调用,在命令行与聊天机器人交互,并查看 API 服务器日志以验证应用程序是否正常运行。

先决条件

设置您的环境#

在处理新的 conda 项目时,建议您创建一个新的环境进行开发。请按照以下步骤为您的聊天机器人设置环境

  1. 打开 Anaconda Prompt(macOS/Linux 上的终端)。

    提示

    如果需要,可以从 IDE(JupyterLab、PyCharm、VSCode、Spyder)中打开此终端。

  2. 通过运行以下命令,为您的聊天机器人开发创建 conda 环境并安装您需要的包

    conda create --name chataconda python requests
    
  3. 通过运行以下命令激活您新创建的 conda 环境

    conda activate chataconda
    

有关管理环境的更多信息和最佳实践,请参阅 环境

构建聊天机器人#

下面,您将找到构建聊天机器人所需的代码片段,以及每个代码片段的解释,以帮助您理解代码的功能。

使用您首选的 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://<SERVER_ADDRESS>:<SERVER_PORT>

通过将以下行添加到您的文件中,将 base_url 设置为指向默认服务器地址。

base_url = 'https://#:8080'

提示

localhost127.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 服务器交互#

构建好聊天机器人后,就可以对您的模型进行测试运行了!

  1. 打开 Anaconda AI Navigator 并 将模型加载到 API 服务器中

  2. 服务器地址服务器端口保留为默认值,然后单击 开始.

  3. 打开终端并导航到您存储 chatter-max.py 文件的目录。

  4. 通过运行以下命令启动聊天机器人

    python chatter-max.py
    
  5. 查看 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