跳转至

简单聊天示例

chat 端点是使用Ollama从LLM生成文本的两种方式之一,在0.1.14版本中引入。从高层次来看,您向端点提供一个包含角色和内容的对象数组。然后,随着每个输出和提示的增加,您添加更多这样的角色/内容对象,从而构建起历史记录。

运行示例

1. 确保您已安装 llama2 模型:

ollama pull llama2

2. 安装Python所需库。

pip install -r requirements.txt

3. 运行示例:

python client.py

代码审查

您可以在 chat 函数中看到,实际调用端点的方式非常简单:

r = requests.post(
  "http://0.0.0.0:11434/api/chat",
  json={"model": model, "messages": messages, "stream": True},
)

使用 generate 端点时,您需要提供一个 prompt。但使用 chat 时,您提供的是 messages。而响应流中包含一个带有 content 字段的 message 对象。

最终的JSON对象不提供完整的内容,因此您需要自行构建内容。

main 函数中,我们收集 user_input 并将其作为消息添加到我们的消息中,然后传递给聊天函数。当LLM完成响应后,输出会作为另一个消息添加。

接下来的步骤

在此示例中,保留了所有生成的内容。您可能希望尝试总结超过10次对话的所有内容,以便在使用更少的上下文时启用更长的历史记录。

源码

client.py

import json
import requests

# NOTE: ollama must be running for this to work, start the ollama app or run `ollama serve`
model = "llama2"  # TODO: update this for whatever model you wish to use


def chat(messages):
    r = requests.post(
        "http://0.0.0.0:11434/api/chat",
        json={"model": model, "messages": messages, "stream": True},
    )
    r.raise_for_status()
    output = ""

    for line in r.iter_lines():
        body = json.loads(line)
        if "error" in body:
            raise Exception(body["error"])
        if body.get("done") is False:
            message = body.get("message", "")
            content = message.get("content", "")
            output += content
            # the response streams one token at a time, print that as we receive it
            print(content, end="", flush=True)

        if body.get("done", False):
            message["content"] = output
            return message


def main():
    messages = []

    while True:
        user_input = input("Enter a prompt: ")
        if not user_input:
            exit()
        print()
        messages.append({"role": "user", "content": user_input})
        message = chat(messages)
        messages.append(message)
        print("\n\n")


if __name__ == "__main__":
    main()

仓库地址

python-simplechat