【003】调用Kimi实现AI对话,流式内容输出_#py
调用Kimi实现AI对话,流式内容输出
- 前言
- 1. 实现流式输出的主要代码块
- 2. 完整代码
前言
流式输出(Streaming),一言以蔽之,就是每当 Kimi 大模型生成了一定数量的 Tokens 时(通常情况下,这个数量是 1 Token),立刻将这些 Tokens 传输给客户端,而不再是等待所有 Tokens 生成完毕后再传输给客户端。当你与 Kimi 智能助手 进行对话时,Kimi 智能助手的回复是按字符逐个“跳”出来的,这即是流式输出的表现之一,流式输出能让用户第一时间看到 Kimi 大模型输出的第一个 Token,减少用户的等待时间。
1. 实现流式输出的主要代码块
本文代码根据【002】调用kimi实现文件上传并进行分析_#py进行改进的,因此以下不再讲述重复的内容,仅对改进和优化的代码进行补充。
本次改进的内容主要基于InputContent
这个函数实现的,以下是该函数的完整示例。
def InputContent(self, content):
"""
这里由原来的对话能力的直接输出的方式,改为流式输出(内容是时时输出的,一段段的进行展示)
主要实现通过内部开关的stream=Ture来实现,内容输出参考for循环
把历史记录添加进对话中,保证对话的连续性
"""
self.messages.append({"role": "user", "content": content})
completion = self.client.chat.completions.create(
model="moonshot-v1-8k",
messages=self.messages,
temperature=0.3,
stream=True, # <-- 注意这里,我们通过设置 stream=True 开启流式输出模式
)
# 当启用流式输出模式(stream=True),SDK 返回的内容也发生了变化,我们不再直接访问返回值中的 choice
# 而是通过 for 循环逐个访问返回值中每个单独的块(chunk)
content_text = ""
print("Kimi AI: ", end="") # 回答的开头
for chunk in completion:
# 在这里,每个 chunk 的结构都与之前的 completion 相似,但 message 字段被替换成了 delta 字段
delta = chunk.choices[0].delta # <-- message 字段被替换成了 delta 字段
if delta.content:
# 我们在打印内容时,由于是流式输出,为了保证句子的连贯性,我们不人为地添加
# 换行符,因此通过设置 end="" 来取消 print 自带的换行符。
print(delta.content, end="")
content_text = content_text + delta.content
print("\n") # 创建一个换行
# 为了让 Kimi 大模型拥有完整的记忆,我们必须将 Kimi 大模型返回给我们的消息也添加到 messages 中, Kimi在对话中的角色是assistant
self.messages.append({'role': 'assistant', 'content': content_text})
# 返回回答内容
return content_text
2. 完整代码
点击传送门 抵达资源地址。