API 服务器教程#

注意

Anaconda AI Navigator 处于测试版。此文档目前正在构建中。

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

先决条件

设置您的环境#

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

  1. 打开一个终端(Windows 上的 Anaconda Prompt)。

    提示

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

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

    conda create -n 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://127.0.0.1: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 -n chataconda --all