调用kimi实现文件上传并进行分析
前言
在【001】调用kimi实现AI对话_#py对Kimi有了一定的介绍,以及简单对话和连续对话的程序编写。
本次主要希望能通过kimi分析文件,总结文件的能力。
1. 上传文件并解析
本文以代码块的形式呈现,调用下面这段upload_files即可实现
注意 变量files一定是列表。
# 多文件上传
def upload_files(self, files):
"""
upload_files 会将传入的文件(路径)全部通过文件上传接口 '/v1/files' 上传,并获取上传后的
文件内容生成文件 messages。每个文件会是一个独立的 message,这些 message 的 role 均为
system,Kimi 大模型会正确识别这些 system messages 中的文件内容。
:param files: 一个包含要上传文件的路径的列表,路径可以是绝对路径也可以是相对路径,请使用字符串
的形式传递文件路径。
:return: 一个包含了文件内容的 messages 列表,请将这些 messages 加入到 Context 中,
即请求 `/v1/chat/completions` 接口时的 messages 参数中。
"""
file_messages = []
# 对每个文件路径,我们都会上传文件并抽取文件内容,最后生成一个 role 为 system 的 message,并加入
# 到最终返回的 messages 列表中。
for file in files:
file_object = self.client.files.create(file=Path(file), purpose="file-extract") # 上传文件
file_content = self.client.files.content(file_id=file_object.id).text # 解析文本
# 加载文件信息入聊天
file_messages.append({
"role": "system",
"content": file_content, })
return file_messages
2. 调用方式
通过QFileDialog调用选择文件的对话框,并判断是否选择了文件。
# 上传文件解析的方式
def InputFile(self, content):
fname, _ = QFileDialog.getOpenFileNames(self, '打开文件', '.', '') # 多文件上传
if fname != []: # 判断是否未选择文件
# self.messages.append({"role": "user", "content": "您好!kimi。"}) # 防止第一次聊天上传记录出错
file_messages = self.upload_files(fname) # 多文件上传云端
self.messages.append(*file_messages) # 我们使用 * 语法,来解构 file_messages 消息,使其成为 messages 列表的前 N 条 messages。
content = content.replace("打开文件", "").replace("选择文件", "").replace("file", "") # 处理历史文件
if content != " " or content != "": self.content = input("用户(对文件的处理): "); self.answer = self.InputContent(self.content) # 输入对文件的处理要求
else: self.answer = self.InputContent(content) # 判断原始输入的记录
return self.answer # 返回kimi的回答
else: print("Kimi AI: 您未选择文件!")
同时在原来【001】调用kimi实现AI对话_#py对中的主函数中添加了触发条件
def main(self):
self.AIclient() # 调用API
# try:
while True:
# 检测用户输入
self.content = input("用户: ")
if "打开文件" in self.content or "选择文件" in self.content or "分析文件" in self.content or "file" in self.content: self.answer = self.InputFile(self.content) # 当检测到输入内容包含上述信息后,触发上传文件的功能
else: self.answer = self.InputContent(self.content) # 正常对话
print(f"Kimi AI: {self.answer}")
time.sleep(2)
# except Exception as e: print(f"An error occurred: {e}")
3. 完整代码
from PyQt5.QtWidgets import *
from openai import OpenAI
import time
import sys
from pathlib import Path
class Main_Name(QWidget):
def __init__(self):
super().__init__()
self.main()
def AIclient(self):
self.client = OpenAI(
api_key="MOONSHOT_API_KEY", # 在这里将 MOONSHOT_API_KEY 替换为你从 Kimi 开放平台申请的 API Key
base_url="https://api.moonshot.cn/v1",
)
self.messages = [{"role": "system", "content": "你是 Kimi。"}, ] # 初始对话内容及预设
def InputContent(self, content):
self.messages.append({"role": "user", "content": content})
completion = self.client.chat.completions.create(
model="moonshot-v1-8k",
messages=self.messages,
temperature=0.3,)
# 通过 API 我们获得了 Kimi 大模型给予我们的回复消息(role=assistant)
assistant_message = completion.choices[0].message
# 为了让 Kimi 大模型拥有完整的记忆,我们必须将 Kimi 大模型返回给我们的消息也添加到 messages 中
self.messages.append(assistant_message)
# 返回回答内容
return completion.choices[0].message.content
# 上传文件解析的方式
def InputFile(self, content):
fname, _ = QFileDialog.getOpenFileNames(self, '打开文件', '.', '') # 多文件上传
if fname != []: # 判断是否未选择文件
# self.messages.append({"role": "user", "content": "您好!kimi。"}) # 防止第一次聊天上传记录出错
file_messages = self.upload_files(fname) # 多文件上传云端
self.messages.append(*file_messages) # 我们使用 * 语法,来解构 file_messages 消息,使其成为 messages 列表的前 N 条 messages。
content = content.replace("打开文件", "").replace("选择文件", "").replace("file", "") # 处理历史文件
if content != " " or content != "": self.content = input("用户(对文件的处理): "); self.answer = self.InputContent(self.content) # 输入对文件的处理要求
else: self.answer = self.InputContent(content) # 判断原始输入的记录
return self.answer # 返回kimi的回答
else: print("Kimi AI: 您未选择文件!")
# 多文件上传
def upload_files(self, files):
"""
upload_files 会将传入的文件(路径)全部通过文件上传接口 '/v1/files' 上传,并获取上传后的
文件内容生成文件 messages。每个文件会是一个独立的 message,这些 message 的 role 均为
system,Kimi 大模型会正确识别这些 system messages 中的文件内容。
:param files: 一个包含要上传文件的路径的列表,路径可以是绝对路径也可以是相对路径,请使用字符串
的形式传递文件路径。
:return: 一个包含了文件内容的 messages 列表,请将这些 messages 加入到 Context 中,
即请求 `/v1/chat/completions` 接口时的 messages 参数中。
"""
file_messages = []
# 对每个文件路径,我们都会上传文件并抽取文件内容,最后生成一个 role 为 system 的 message,并加入
# 到最终返回的 messages 列表中。
for file in files:
file_object = self.client.files.create(file=Path(file), purpose="file-extract")
file_content = self.client.files.content(file_id=file_object.id).text
file_messages.append({
"role": "system",
"content": file_content, })
return file_messages
def main(self):
self.AIclient() # 调用API
# try:
while True:
# 检测用户输入
self.content = input("用户: ")
if "打开文件" in self.content or "选择文件" in self.content or "分析文件" in self.content or "file" in self.content: self.answer = self.InputFile(self.content)
else: self.answer = self.InputContent(self.content)
print(f"Kimi AI: {self.answer}")
time.sleep(2)
# except Exception as e: print(f"An error occurred: {e}")
# 通过 API 我们获得了 Kimi 大模型给予我们的回复消息(role=assistant)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Main_Name()
ex.show()
sys.exit(app.exec_())