开发聊天机器人#

在本教程中,您将学习用 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 = 'http://localhost:8080'

提示

localhost127.0.0.1在语义上相同。

添加 API 调用#

本教程介绍了最常见的 API 终端节点。有关 API 终端节点的完整列表以及如何有效使用它们的详细信息,请参阅官方 llama.cpp HTTP 服务器文档

要使您的应用程序能够与 API 服务器通信,您必须实现以服务器可以理解的方式进行 API 调用的函数。

GET /health#

在向服务器发送任何请求之前,最好验证服务器是否正常运行。此函数将 GET 请求发送到/healthendpoint 并返回一个 JSON 响应,告诉您服务器的状态。

将以下行添加到chatter-max.py文件:

def get_server_health():
    response = requests.get(f'{base_url}/health')
    return response.json()

POST /完成#

要与模型交互,您必须有一个函数来提示服务器的/completion端点。此函数将用户输入发送到加载到 API 服务器中的模型,并接收生成的响应。

此处的提示构造提供了context为您希望模型如何响应用户设定基调。从本质上讲,这是模型的初始提示,它为您的模型 “定下基调”。我们稍后会重新讨论这个问题。

分离User:Assistant:输入到新行(由各自的标签描绘)有助于模型区分对话的各个部分。如果没有这种区别,模型将假设用户希望它完成他们的输入,而不是响应它。

datadictionary 是一个结构化的参数集合,用于控制 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通过附加最新的用户输入和 Assistant 的响应,从而使模型参与对话。

将以下行添加到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. Server AddressServer Port 保留为默认值,然后单击 开始

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

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

    python chatter-max.py
    
  5. 查看 Anaconda AI Navigator API 服务器日志。如果一切都设置正确,服务器日志将填充来自您的聊天机器人应用程序的流量,从运行状况检查开始,然后是初始context提示符。

与模型一起玩得开心#

尝试调整/completionendpoint 的data字典中查看它们如何影响模型的输出。

temperature#

调整模型的温度可以增加或减少您从提示中收到的响应的随机性。较高的值(例如1.0) 使输出更加自由流畅和富有创意。较低的值(示例0.2) 使输出更具确定性和重点性。默认为0.8.

top_k#

限制top_k参数将模型的响应限制为kmost probable token 的 Token。降低可用标记就像限制模型在尝试猜测下一个单词时必须选择的单词。top_k默认为40.尝试将top_k设置为 higher 和 lower 值,以查看模型如何响应同一提示。

top_p#

将标记选择限制为累积概率高于阈值的标记子集,以平衡创造力与连贯性。较高的值使模型能够提供更具创意的响应,而较低的值可增强焦点。调整top_p以查看它如何影响对同一 Prompt 的模型的描述性。默认为0.95.

stream#

设置streamtrue来逐个标记查看模型的响应。流式处理设置为false默认情况下。

后续步骤#

您可以通过包含其他终端节点来继续开发和扩展此聊天机器人以进行更高级的用途(如标记化或插槽管理),也可以通过运行以下命令删除此文件并清理 conda 环境:

conda deactivate
conda remove --name chataconda --all