调用kimi实现文件上传并进行分析
- 前言
- 1. 上传文件并解析
- 2. 调用方式
- 3. 完整代码
前言
在【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 Pathclass 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 Keybase_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).textfile_messages.append({"role": "system","content": file_content, })return file_messagesdef 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_())