【002】调用kimi实现AI对话,文件上传并进行分析_#py

调用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_())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木易:_/

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值