简单聊天示例¶
chat 端点是使用Ollama从LLM生成文本的两种方式之一,在0.1.14版本中引入。从高层次来看,您向端点提供一个包含角色和内容的对象数组。然后,随着每个输出和提示的增加,您添加更多这样的角色/内容对象,从而构建起历史记录。
运行示例¶
1. 确保您已安装 llama2
模型:
2. 安装Python所需库。
3. 运行示例:
代码审查¶
您可以在 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()