首页 > 编程语言 >小白学 Python:在 Python 中创建 ChatGPT 克隆

小白学 Python:在 Python 中创建 ChatGPT 克隆

时间:2023-10-22 11:05:30浏览次数:51  
标签:ft name Python 应用程序 colors 小白学 ChatGPT message user

小白学 Python:在 Python 中创建 ChatGPT 克隆_Python

在 Python 中创建 ChatGPT 克隆

我们将学习如何使用 Python 中的 Flet 开发具有多个节点的聊天应用程序以及使用 OpenAI 的 text-davinci-003 [ChatGPT API]模型引擎制作的应答机器人

Flet是什么?

小白学 Python:在 Python 中创建 ChatGPT 克隆_Text_02

无需直接使用 Flutter,程序员就可以使用 Flet Python 库创建实时 Web、移动和桌面应用程序。在使用Flutter创建应用程序时,开发人员必须了解Dart 编程语言,但通过使用 Flet 模块和简单的 Python 代码,我们可以创建功能与使用 Flutter 创建的应用程序类似的应用程序。

Flet的主要特点:

  • Flutter 提供支持:您的应用程序在任何平台上都会看起来很棒并且功能强大,因为 Flet UI 是使用 Flutter 制作的。Flet 通过使用命令式编程语言将较小的“小部件”合并到即用型“控件”中,从而简化了 Flutter 策略。
  • 架构:使用 Flet,您只需使用 Python 编写一个整体式有状态应用程序,并获得一个多用户、实时单页应用程序。
  • 能够将应用程序交付到任何设备:我们可以将 Flet 应用程序部署为 Web 应用程序并在浏览器中运行它。该软件包还可以安装在 Windows、macOS 和 Linux 上。也可以安装在手机上。

所需模块:

在本教程中,我们将使用 Python 的 Flet 模块和 openai 模块 [ChatGPT]。要使用 pip 安装它,请在终端中运行以下命令。

pip install flet
pip install openai

源代码 :

import flet as ft 


class Message(): 
	def __init__(self, user_name: str, text: str, message_type: str): 
		self.user_name = user_name 
		self.text = text 
		self.message_type = message_type 


class ChatMessage(ft.Row): 
	def __init__(self, message: Message): 
		super().__init__() 
		self.vertical_alignment = "start"
		self.controls = [ 
			ft.CircleAvatar( 
				content=ft.Text(self.get_initials(message.user_name)), 
				color=ft.colors.WHITE, 
				bgcolor=self.get_avatar_color(message.user_name), 
			), 
			ft.Column( 
				[ 
					ft.Text(message.user_name, weight="bold"), 
					ft.Text(message.text, selectable=True), 
				], 
				tight=True, 
				spacing=5, 
			), 
		] 

	def get_initials(self, user_name: str): 
		return user_name[:1].capitalize() 

	def get_avatar_color(self, user_name: str): 
		colors_lookup = [ 
			ft.colors.AMBER, 
			ft.colors.BLUE, 
			ft.colors.BROWN, 
			ft.colors.CYAN, 
			ft.colors.GREEN, 
			ft.colors.INDIGO, 
			ft.colors.LIME, 
			ft.colors.ORANGE, 
			ft.colors.PINK, 
			ft.colors.PURPLE, 
			ft.colors.RED, 
			ft.colors.TEAL, 
			ft.colors.YELLOW, 
		] 
		return colors_lookup[hash(user_name) % len(colors_lookup)] 


def main(page: ft.Page): 
	page.horizontal_alignment = "stretch"
	page.title = "ChatGPT - Flet"

	def join_chat_click(e): 
		if not join_user_name.value: 
			join_user_name.error_text = "Name cannot be blank!"
			join_user_name.update() 
		else: 
			page.session.set("user_name", join_user_name.value) 
			page.dialog.open = False
			new_message.prefix = ft.Text(f"{join_user_name.value}: ") 
			page.pubsub.send_all(Message(user_name=join_user_name.value, 
										text=
			f"{join_user_name.value}+has joined the chat.", message_type="login_message")) 
			page.update() 

	def send_message_click(e): 
		if new_message.value != "": 
			page.pubsub.send_all(Message(page.session.get( 
				"user_name"), new_message.value, message_type="chat_message")) 
			temp = new_message.value 
			new_message.value = "" 
			new_message.focus() 
			res = chatgpt(temp) 
			if len(res) > 220: # adjust the maximum length as needed 
				res = '\n'.join([res[i:i+220] 
								for i in range(0, len(res), 220)]) 
			page.pubsub.send_all( 
				Message("ChatGPT", res, message_type="chat_message")) 
			page.update() 

	def chatgpt(message): 
		import openai 

		# 设置 OpenAI API 客户端
		openai.api_key = "YOUR API"

		# Set up the model and prompt 
		model_engine = "text-davinci-003"
		prompt = message 
		# Generate a response 
		completion = openai.Completion.create( 
			engine=model_engine, 
			prompt=prompt, 
			max_tokens=1024, 
			n=1, 
			stop=None, 
			temperature=0.5, 
		) 

		response = completion.choices[0].text.strip() 
		if response.startswith('\n'): 
			response = response[1:] 
		return response 

	def on_message(message: Message): 
		if message.message_type == "chat_message": 
			m = ChatMessage(message) 
		elif message.message_type == "login_message": 
			m = ft.Text(message.text, italic=True, 
						color=ft.colors.BLACK45, size=12) 
		chat.controls.append(m) 
		page.update() 

	page.pubsub.subscribe(on_message) 

# 对话框要求输入用户显示名称
	join_user_name = ft.TextField( 
		label="Enter your name to join the chat", 
		autofocus=True, 
		on_submit=join_chat_click, 
	) 
	page.dialog = ft.AlertDialog( 
		open=True, 
		modal=True, 
		title=ft.Text("Welcome!"), 
		content=ft.Column([join_user_name], width=300, height=70, tight=True), 
		actions=[ft.ElevatedButton( 
			text="Join chat", on_click=join_chat_click)], 
		actions_alignment="end", 
	) 

	# Chat messages 
	chat = ft.ListView( 
		expand=True, 
		spacing=10, 
		auto_scroll=True, 
	) 

	# A new message entry form 
	new_message = ft.TextField( 
		hint_text="Write a message...", 
		autofocus=True, 
		shift_enter=True, 
		min_lines=1, 
		max_lines=5, 
		filled=True, 
		expand=True, 
		on_submit=send_message_click, 
	) 

	# Add everything to the page 
	page.add( 
		ft.Container( 
			content=chat, 
			border=ft.border.all(1, ft.colors.OUTLINE), 
			border_radius=5, 
			padding=10, 
			expand=True, 
		), 
		ft.Row( 
			[ 
				new_message, 
				ft.IconButton( 
					icon=ft.icons.SEND_ROUNDED, 
					tooltip="Send message", 
					on_click=send_message_click, 
				), 
			] 
		), 
	) 


# 将 flet 应用程序作为网络应用程序在浏览器上运行
ft.app(target=main, port=9000, view=ft.WEB_BROWSER) 
# 将 flet 应用程序作为桌面应用程序运行
ft.app(target=main)

代码说明:

Message 类定义消息的结构,ChatMessage 类创建可在聊天中显示的消息的图形表示。主函数定义了聊天应用程序的整体结构,包括聊天窗口、新的消息输入表单以及从 OpenAI 的 GPT-3 语言模型发送消息和接收响应的功能。

聊天应用程序使用 flet 库创建图形用户界面,包括文本字段、按钮和图标。ft.app 函数启动 Web 服务器并在 Web 浏览器中呈现聊天应用程序。

笔记:

在上面代码的第 88 行添加您自己的 OpenAI 密钥 (https://platform.openai.com/account/api-keys)。

要在浏览器上运行 Flet 应用程序,请将这段代码添加到代码底部:

ft.app(port=any-port-number,target=main,view=ft.WEB_BROWSER)

要将 Flet 应用程序作为桌面应用程序运行,请将这段代码添加到代码底部:

ft.app(target=main)

输出 :

小白学 Python:在 Python 中创建 ChatGPT 克隆_应用程序_03

聊天应用程序加入选项

小白学 Python:在 Python 中创建 ChatGPT 克隆_应用程序_04

在 Python 中使用 Flet 的 ChatGPT 响应应用程序



标签:ft,name,Python,应用程序,colors,小白学,ChatGPT,message,user
From: https://blog.51cto.com/demo007x/7974332

相关文章

  • 小白学 Python: 如何在Python中使用ChatGPT API?
    如何在Python中使用ChatGPTAPI?ChatGPT及其必然的应用。日复一日,我们周围的一切似乎都在通过使用不同人工智能和机器学习技术的多个人工智能模型以及使用Python的聊天机器人而变得自动化,聊天GPT的用途及其有用的应用程序之一我们今天将讨论。因此,在讨论其应用程序之前,让我们先......
  • python包引用方式总结
    本文为博主原创,转载请注明出处:在Python中,有多种引用包的方式。以下是常见的方式:1.import语句import语句是最常见和推荐的引用包的方式。它允许你引入整个包或包中的特定模块/子模块。importpackage_nameimportpackage_name.module_namefrompackage_nameimportmod......
  • 2023 版 Java和python开发线性代数探索
    目录前景提示需求分析1、初始化不需要指定矩阵的尺寸,并且可以直接传入数据。2、可以计算2x2矩阵的逆3、可以做2x2的矩阵乘法Java版本开发一、开发详情1、开发一个子类,如图所示。2、根据问题修改子类,父类,以便真实可用解决1、初始化不需要指定矩阵的尺寸,并且可以直接传入数据。解决......
  • bytewax python 流处理框架
    bytewaxpython流处理框架,支持批以及流处理,内部使用了timely-dataflowrust库bytewax支持的模式主要是多worker以及多process核心还是单机场景,暂时不支持多主机的集群模式,同时对于状态的存储以及recovery使用了sqlite说明以前我也介绍过一个基于rust的流处理引擎arroyo,......
  • ChatGPT是如何产生心智的?
    一、前言-ChatGPT真的产生心智了吗?来自斯坦福大学的最新研究结论,一经发出就造成了学术圈的轰动,“原本认为是人类独有的心智理论(TheoryofMind,ToM),已经出现在ChatGPT背后的AI模型上”。所谓心智理论,就是理解他人或自己心理状态的能力,包括同理心、情绪、意图等。这项研究中,作者......
  • Python入门系列20-日志logging模块
    一、概念日志是一种可以追踪某些软件运行时所发生事件的方法。软件开发人员可以在他们的代码中调用日志记录相关的方法来表明发生了某些事件,通过一个描述性的消息来描述这个事件,该消息能够可选的包含可变数据。而事件有重要性的概念,重要性被称为严重性级别。二、日志的作用通过记录......
  • 内核文档翻译(chatgpt) —— Pathname lookup (路径名查找)
    原文:https://www.kernel.org/doc/html/latest/filesystems/path-lookup.html内核中文件系统相关的文档汇总:FilesystemsintheLinuxkernelThiswrite-upisbasedonthreearticlespublishedatlwn.net:PathnamelookupinLinuxRCU-walk:fasterpathnamelookupinLi......
  • Python入门指南
    Python入门指南Python中的“文本”代码用计算机程序设计语言写成的,可以被计算机执行的文本称为代码。输入从外界将数据传递给程序称为输入,即通过输入设备(例如:鼠标、键盘、和摄像头等)向计算机输入数据和信息。输出程序将数据传递给外界称为输出,即把计算机处理结果(例如:屏幕显......
  • Python-Json异常:Object of type Decimal is not JSON serializable
    源起:使用python分离出一串文本,因为是看起来像整数,结果json转换时发生异常:TypeError:ObjectoftypeDecimalisnotJSONserializablemsgInfo={"uid":3232324232}json.dumps(msgInfo,ensure_ascii=False)原因:decimal格式不能被json.dumps正确处理。json.dumps函数发现字......
  • ​在二叉搜索树中查找第n个最小节点的Python实现
    二叉搜索树(BinarySearchTree,BST)是一种非常常用的数据结构,它具有许多优秀的性质,例如插入、删除和查找的效率都非常高。今天我们要探讨的问题是:如何在二叉搜索树中查找第n个最小的节点。 首先,我们需要明白二叉搜索树的一个重要性质:对于任何一个节点,其左子树中的所有节点的值都小于......