AI学习记录 - 规范化输出对接现有系统的实例

假设我们有一个学生管理系统,通过prompt提示,格式化输出然后对接现有系统,也是通过react实现,因为这只是一个知识分享,没弄太复杂(使用react实现)。

学生管理系统

在这里插入图片描述

1、设计好prompt

getMemory() {return [{content: "我有一个系统处理人物信息 我有json格式数据是一个数组,数组每一项格式如:" +"person: { \"name姓名\": \"Cathy\", \"age年龄\": 25, \"gender性别\": \"female\"," +" \"hometown家乡\": \"Guangzhou\", \"occupation职业\": \"teacher\" }。" +" 我有四个方法 addPerson(person)新增人物;removePerson(person)传入person对象 " +"里面依据name删除人物;findPerson(person)根据persion对象的name查询人物;" +"updatePerson(person)传入person对象里面根据name查询人物;updateAllPerson(person)传入属性," +"可以修改全部人的属性,例如传入{\"age\": 25},所有的人年龄都修改成25。" +" 下面我给你指令,请你调用适当的方法,传入适当的参数帮助我操作系统。 例如:我说:帮我删除名字为david的人," +"你就返回指令:@{\"methods\":\"removePerson\",\"data\":{\"name\":\"david\"}}@;每条指令只能操作一个人物," +"你可以返回多条指令;是否明白",role: "user",},{content: "明白了。以下是根据您的指令给出的操作:帮我新增一个人,名字叫做Tom,年龄为30,性别为male,家乡为Shanghai,职业为engineer。" +"返回指令:帮我新增一个人,名字叫做Tom,年龄为30,性别为male,家乡为Shanghai,职业为engineer。" +"返回指令:@{\"methods\":\"addPerson\",\"data\":{\"name\":\"Tom\",\"age\":30,\"gender\":\"male\",\"hometown\":\"Shanghai\",\"occupation\":\"engineer\"}}@" +"帮我删除名字为Cathy的人。" +"返回指令:@{\"methods\":\"removePerson\",\"data\":{\"name\":\"Cathy\"}}@" +"帮我查找名字为John的人。" +"返回指令:@{\"methods\":\"findPerson\",\"data\":{\"name\":\"John\"}}@" +"帮我更新名字为Lucy的人的信息,把家乡改为Beijing,职业改为doctor。" +"返回指令:@{\"methods\":\"updatePerson\",\"data\":{\"name\":\"Lucy\",\"hometown\":\"Beijing\",\"occupation\":\"doctor\"}}@",role: "assistant"}]}

2、设计好对应的系统api代码

addPerson(person) {this.list.push(person);}removePerson(person) {const index = this.list.findIndex((p) => p.name.toLowerCase() === person.name.toLowerCase());if (index !== -1) {this.list.splice(index, 1);}}findPerson(person) {if (person.name === "") {return this.list;}return this.list.filter((p) => p.name.toLowerCase() === person.name.toLowerCase());}updatePerson(person) {const index = this.list.findIndex((p) => p.name.toLowerCase() === person.name.toLowerCase());if (index !== -1) {this.list[index] = {...this.list[index],...person};}}updateAllPerson(attr, callback) {let arr = this.list.map((item) => {return {...item,...attr}});this.list = arr;console.log("arr", arr);if (callback) callback(arr);}

3、解析gpt返回字符的方法

    action = (str, callback) => {const match = str.match(/@(.*?)@/g);console.log("match", match);if (match.length) {match.map((gptOrder) => {const match = gptOrder.match(/@(.*?)@/);const result = match ? match[1] : null;let json = JSON.parse(result);this[json.methods](json.data);});callback({result: true,response: "操作成功"});} else {callback({result: false,response: str});}}

全部代码,
index.js


import React, { useContext, useState, useCallback, useRef, useEffect } from 'react';
import People from "./People";import { Space, Table, Drawer, Form, Input, Button, message } from 'antd';
const { Search } = Input;
const { TextArea } = Input;const App = () => {const people = useRef(new People());const [messageApi, contextHolder] = message.useMessage();const key = 'updatable';const [actionType, setActionType] = useState(false);const [textAreaValue, setTextAreaValue] = useState("");const [open, setOpen] = useState(false);const [list, setList] = useState([]);const [initialValues, setInitialValues] = useState({});useEffect(() => {setList(people.current.list);}, []);const success = () => {messageApi.open({key,type: 'loading',content: 'ChatGPT Loading ...',duration: 30});};const onFinish = (values) => {setInitialValues({});if (actionType === "update") {people.current.updatePerson(values);setOpen(false);setList(JSON.parse(JSON.stringify(people.current.list)));} else {people.current.addPerson(values);setOpen(false);setList(JSON.parse(JSON.stringify(people.current.list)));}}const getTable = () => {const columns = [{title: '姓名',dataIndex: 'name',key: 'name',},{title: '年龄',dataIndex: 'age',key: 'age',},{title: '性别',dataIndex: 'gender',key: 'gender',},{title: '老家',dataIndex: 'hometown',key: 'hometown',},{title: '职业',dataIndex: 'occupation',key: 'occupation',},{title: 'Action',key: 'action',render: (_, record) => (<Space size="middle"><a onClick={() => {setOpen(true);setInitialValues(record);setActionType("update");}}>edit</a><a onClick={() => {people.current.removePerson(record);setList(JSON.parse(JSON.stringify(people.current.list)));}}>delete</a></Space>),},];const onSearch = (value) => {setList(JSON.parse(JSON.stringify(people.current.findPerson(value))));}// useEffect(() => {//   success();// }, [open])return (<div style={{ padding: 20 }}>{contextHolder}<Button style={{ marginRight: 10 }} type="primary" onClick={() => {setInitialValues(() => { });setOpen(true);setActionType("add");}}>News</Button><Search style={{ marginLeft: 20 }} placeholder="input search text" onSearch={onSearch} style={{ width: 200 }} /><Button style={{ marginRight: 10 }} type="primary" onClick={() => {success();people.current.toChatGPT(textAreaValue, (result) => {if (result.result) {messageApi.open({key,type: 'success',content: result.response,duration: 2,});setList(JSON.parse(JSON.stringify(people.current.list)));} else {messageApi.open({key,type: 'fail',content: result.response,duration: 2,});}});}}>执行</Button><div style={{ marginTop: 10 }}><TextAreaplaceholder='你可以要求chatgpt帮助你完成某些内容'onChange={(e) => {setTextAreaValue(e.target.value)}}/></div><Table dataSource={list} columns={columns} /><DraweronClose={() => { setOpen(false); }}title="Basic Drawer" placement="right" open={open}>{open ? (<Formname="basic"labelCol={{ span: 8 }}wrapperCol={{ span: 16 }}style={{ maxWidth: 600 }}initialValues={initialValues}onFinish={onFinish}autoComplete="off"><Form.Itemlabel="name"name="name"><Input disabled={actionType === "add" ? false : true} /></Form.Item><Form.Itemlabel="age"name="age"><Input /></Form.Item><Form.Itemlabel="gender"name="gender"><Input /></Form.Item><Form.Itemlabel="hometown"name="hometown"><Input /></Form.Item><Form.Itemlabel="occupation"name="occupation"><Input /></Form.Item><Form.Item wrapperCol={{ offset: 8, span: 16 }}><Button type="primary" htmlType="submit">Submit</Button></Form.Item></Form>) : null}</Drawer></div>)}const getChart = () => {return (<div id="main"></div>)}return (<div>{getTable()}{getChart()}</div>)
}
export default App;

人物类
people.js

import axios from 'axios';
class People {constructor(name, age, gender, hometown, occupation) {this.name = name;this.age = age;this.gender = gender;this.hometown = hometown;this.occupation = occupation;this.list = [];this.addPerson({ name: "Cathy", age: 25, gender: "female", hometown: "Guangzhou", occupation: "teacher" });this.addPerson({ name: "David", age: 28, gender: "male", hometown: "Chengdu", occupation: "designer" });this.addPerson({ name: "Emily", age: 31, gender: "female", hometown: "Hangzhou", occupation: "writer" });this.addPerson({ name: "Frank", age: 37, gender: "male", hometown: "Suzhou", occupation: "entrepreneur" });this.addPerson({ name: "Alice", age: 23, gender: "female", hometown: "Beijing", occupation: "student" });this.addPerson({ name: "Bob", age: 30, gender: "male", hometown: "Shanghai", occupation: "engineer" });this.addPerson({ name: "George", age: 22, gender: "male", hometown: "Wuhan", occupation: "student" });this.addPerson({ name: "Helen", age: 29, gender: "female", hometown: "Tianjin", occupation: "doctor" });this.addPerson({ name: "Isaac", age: 27, gender: "male", hometown: "Xian", occupation: "researcher" });this.addPerson({ name: "Julia", age: 33, gender: "female", hometown: "Nanjing", occupation: "manager" });this.addPerson({ name: "Kevin", age: 26, gender: "male", hometown: "Chongqing", occupation: "teacher" });this.addPerson({ name: "Lily", age: 24, gender: "female", hometown: "Shenzhen", occupation: "engineer" });this.addPerson({ name: "Mike", age: 30, gender: "male", hometown: "Qingdao", occupation: "entrepreneur" });this.addPerson({ name: "Nancy", age: 28, gender: "female", hometown: "Zhengzhou", occupation: "designer" });this.addPerson({ name: "Oscar", age: 35, gender: "male", hometown: "Ningbo", occupation: "writer" });this.addPerson({ name: "Penny", age: 27, gender: "female", hometown: "Changsha", occupation: "student" });this.addPerson({ name: "Quincy", age: 29, gender: "male", hometown: "Fuzhou", occupation: "teacher" });this.addPerson({ name: "Rose", age: 32, gender: "female", hometown: "Shijiazhuang", occupation: "doctor" });this.addPerson({ name: "Simon", age: 36, gender: "male", hometown: "Wuxi", occupation: "researcher" });this.addPerson({ name: "Tina", age: 31, gender: "female", hometown: "Changchun", occupation: "manager" });this.addPerson({ name: "Vincent", age: 34, gender: "male", hometown: "Harbin", occupation: "designer" });this.addPerson({ name: "Wendy", age: 26, gender: "female", hometown: "Foshan", occupation: "manager" });this.addPerson({ name: "Xavier", age: 28, gender: "male", hometown: "Yangzhou", occupation: "entrepreneur" });this.addPerson({ name: "Yvonne", age: 33, gender: "female", hometown: "Jinan", occupation: "teacher" });this.addPerson({ name: "Zack", age: 30, gender: "male", hometown: "Zhuhai", occupation: "writer" });this.addPerson({ name: "Alice", age: 29, gender: "female", hometown: "Haikou", occupation: "doctor" });}addPerson(person) {this.list.push(person);}removePerson(person) {const index = this.list.findIndex((p) => p.name.toLowerCase() === person.name.toLowerCase());if (index !== -1) {this.list.splice(index, 1);}}findPerson(person) {if (person.name === "") {return this.list;}return this.list.filter((p) => p.name.toLowerCase() === person.name.toLowerCase());}updatePerson(person) {const index = this.list.findIndex((p) => p.name.toLowerCase() === person.name.toLowerCase());if (index !== -1) {this.list[index] = {...this.list[index],...person};}}updateAllPerson(attr, callback) {let arr = this.list.map((item) => {return {...item,...attr}});this.list = arr;console.log("arr", arr);if (callback) callback(arr);}getMemory() {return [{content: "我有一个系统处理人物信息 我有json格式数据是一个数组,数组每一项格式如:" +"person: { \"name姓名\": \"Cathy\", \"age年龄\": 25, \"gender性别\": \"female\"," +" \"hometown家乡\": \"Guangzhou\", \"occupation职业\": \"teacher\" }。" +" 我有四个方法 addPerson(person)新增人物;removePerson(person)传入person对象 " +"里面依据name删除人物;findPerson(person)根据persion对象的name查询人物;" +"updatePerson(person)传入person对象里面根据name查询人物;updateAllPerson(person)传入属性," +"可以修改全部人的属性,例如传入{\"age\": 25},所有的人年龄都修改成25。" +" 下面我给你指令,请你调用适当的方法,传入适当的参数帮助我操作系统。 例如:我说:帮我删除名字为david的人," +"你就返回指令:@{\"methods\":\"removePerson\",\"data\":{\"name\":\"david\"}}@;每条指令只能操作一个人物," +"你可以返回多条指令;是否明白",role: "user",},{content: "明白了。以下是根据您的指令给出的操作:帮我新增一个人,名字叫做Tom,年龄为30,性别为male,家乡为Shanghai,职业为engineer。" +"返回指令:帮我新增一个人,名字叫做Tom,年龄为30,性别为male,家乡为Shanghai,职业为engineer。" +"返回指令:@{\"methods\":\"addPerson\",\"data\":{\"name\":\"Tom\",\"age\":30,\"gender\":\"male\",\"hometown\":\"Shanghai\",\"occupation\":\"engineer\"}}@" +"帮我删除名字为Cathy的人。" +"返回指令:@{\"methods\":\"removePerson\",\"data\":{\"name\":\"Cathy\"}}@" +"帮我查找名字为John的人。" +"返回指令:@{\"methods\":\"findPerson\",\"data\":{\"name\":\"John\"}}@" +"帮我更新名字为Lucy的人的信息,把家乡改为Beijing,职业改为doctor。" +"返回指令:@{\"methods\":\"updatePerson\",\"data\":{\"name\":\"Lucy\",\"hometown\":\"Beijing\",\"occupation\":\"doctor\"}}@",role: "assistant"}]}async toChatGPT(question, callback) {let str = await this.getList(question, callback);this.action(str, callback);}getList = (question, callback) => {return new Promise((resolve) => {axios.post('/search/send', {message: [...this.getMemory(),{content: question,role: "user"}],}).then((response) => {// 请求成功resolve(response.data.choices[0].message.content);}).catch((error) => {// 请求失败,callback({result: true,response: "程序错误,请重新请求"});console.log(error);});})}action = (str, callback) => {const match = str.match(/@(.*?)@/g);console.log("match", match);if (match.length) {match.map((gptOrder) => {const match = gptOrder.match(/@(.*?)@/);const result = match ? match[1] : null;let json = JSON.parse(result);this[json.methods](json.data);});callback({result: true,response: "操作成功"});} else {callback({result: false,response: str});}}
}
export default People;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/49583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python对某音乐论坛进行简单的采集

今天简单的用Python来采集一下某论坛的歌曲 环境使用 Python 3.10 Pycharm 模块使用 requests --> 发送请求 pip install requests execjs --> pip install execjs re 正则源码和视频讲解都打包好了&#xff0c;文末名片自取 基本流程 一、数据来源分析 1.明…

手写RPC-令牌桶限流算法实现,以及常见限流算法

为什么需要服务限流、降级 分布式架构下&#xff0c;不同服务之间频繁调用&#xff0c;对于某个具体的服务而言&#xff0c;可能会面临高并发场景。在这样的情况下&#xff0c;提供服务的每个服务节点就都可能由于访问量过大而引起一系列问题&#xff0c;比如业务处理耗时过长、…

VMware三种网络模式---巨细

文章目录 目录 ‘一.网络模式概述 二.桥接模式 二.NAT模式 三.仅主机模式 四.案例演示 防火墙配置&#xff1a; 虚拟电脑配置 前言 本文主要介绍VMware的三种网络模式 ‘一.网络模式概述 VMware中分为三种网络模式&#xff1a; 桥接模式&#xff1a;默认与宿主机VMnet0绑…

基于Java中的SSM框架实现商店积分管理系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现商店积分管理系统演示 摘要 随着时代的发展&#xff0c;信息化的管理手段已被普遍应用于企业的日常运作中。在当今竞争激烈的市场中&#xff0c;消费者的需求量日益增长&#xff0c;而商品信息的管理也变得越来越复杂&#xff0c;因此&#xff0c;实施…

14. Hibernate 一对多双向关联映射

1. 前言 本节课程和大家一起聊聊一对多关联映射。通过本节课程&#xff0c;你将了解到&#xff1a; 如何实现一对多关联映射&#xff1b; 如何实现双向一对多关联映射&#xff1b; 关联映射中的级联操作。 2. 一对多关联映射 关系型数据库中表与表中的数据存在一对多&…

深入理解Linux网络(八):内核如何发送网络包

深入理解Linux网络&#xff08;八&#xff09;&#xff1a;内核如何发送网络包 一、总览二、网卡启动准备三、ACCEPT 创建新 SOCKET四、开始发送数据send 系统调⽤实现传输层处理传输层拷贝传输层发送 网络层发送原理邻居⼦系统网络设备子系统软中断调度igb网卡驱动发送发送完成…

Python 实现PDF和TIFF图像之间的相互转换

PDF是数据文档管理领域常用格式之一&#xff0c;主要用于存储和共享包含文本、图像、表格、链接等的复杂文档。而TIFF&#xff08;Tagged Image File Format&#xff09;常见于图像处理领域&#xff0c;主要用于高质量的图像文件存储。 在实际应用中&#xff0c;我们可能有时需…

wefwefwe

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

在 ArkTS 中集成 C 语言模块来管理文件描述符

文章目录 前言ArkTS模块C语言模块C模块代码 总结 前言 在现代开发中&#xff0c;尤其是在处理文件操作时&#xff0c;使用文件描述符&#xff08;fd&#xff09;是一种常见的方法。ArkTS提供了一种强大的方式来与底层C代码交互&#xff0c;使我们能够利用C语言的性能优势来管理…

dsa加训

refs: OI Wiki - OI Wiki (oi-wiki.org) 1. 枚举 POJ 2811 熄灯问题 refs : OpenJudge - 2811:熄灯问题 如果要枚举每个灯开或者不开的情况&#xff0c;总计2^30种情况&#xff0c;显然T。 不过我们可以发现&#xff1a;若第i行的某个灯亮了&#xff0c;那么有且仅有第i行和第…

Win10使用VS Code远程连接Ubuntu服务器时遇到SSH公钥错误的解决方案

在使用Windows 10上的Visual Studio Code&#xff08;VS Code&#xff09;远程连接Ubuntu 20.04服务器时&#xff0c;遇到了以下错误&#xff1a; 错误的原因 这个错误消息表明&#xff0c;SSH 客户端检测到远程主机的 ECDSA 公钥已更改。可能是由于以下原因之一&#xff1a…

组蛋白乳酸化 | 调控蛋白Writers、Erasers和Readers

组蛋白修饰的调控可以被归类为三类蛋白&#xff1a;Writers&#xff08;写入者&#xff09;、Erasers&#xff08;擦除者&#xff09;和Readers&#xff08;读取者&#xff09;。Writers是负责在组蛋白上添加修饰基团的蛋白&#xff0c;包括乙酰化、甲基化等修饰。Erasers则是负…

学习记录——day17 数据结构 队列 链式队列

队列介绍 1、队列也是操作受限的线性表:所有操作只能在端点处进行&#xff0c;其删除和插入必须在不同端进行 2、允许插入操作的一端称为队尾&#xff0c;允许删除操作的一端称为队头 3、特点:先进先出(FIFO) 4、分类&#xff1a; 顺序存储的栈称为顺序栈 链式存储的队列&a…

IP数据报结构详解:从基础到进阶

目录 IP数据报的格式 IP数据报首部的固定部分 IP数据报首部的可变部分 实例分析&#xff1a;数据报的分片 生存时间&#xff08;TTL&#xff09;与协议 首部检验和 总结 在网络通信中&#xff0c;IP数据报是至关重要的基本单元。本文将带您深入了解IP数据报的格式及其各个…

【Python】使用抓包Fiddler软件,网络查询 遇到“您的连接不是私密连接”的问题的解决方法

使用Fiddler抓包软件很久&#xff0c;忽然发现网络使用有问题&#xff0c;一点开浏览器就会出现类似下面的页面&#xff1a; 检查了网络情况发现不是网络的问题&#xff0c;也排除了封号的可能。发现只要把抓包软件Fiddler关闭以后就没问题了&#xff0c;就知道问题是出在软件…

国产光电耦合器2024年的机遇与挑战

随着科技的飞速发展&#xff0c;2024年对于国产光电耦合器行业来说&#xff0c;无疑是充满机遇与挑战的一年。本文将深入探讨该行业在技术创新、市场竞争、5G时代、新兴应用领域和国际市场拓展方面的现状及未来前景。 技术创新的黄金期 物联网和人工智能技术的迅猛发展&#x…

Java之集合底层-数据结构

Java集合之数据结构 1 概述 数据结构是计算机科学中研究数据组织、存储和操作的一门学科。它涉及了如何组织和存储数据以及如何设计和实现不同的数据操作算法和技术。常见的据结构有线性数据结构&#xff08;含数组、链表、栈和队列等&#xff09;&#xff0c;非线性数据结构…

睿考网:中级会计师考试各科分值是多少?

中级会计考试是会计领域的一个重要考核&#xff0c;考试题型包含多种&#xff1a;单选题、多选题、判断题、计算分析题和综合题。这些不同的题型不仅覆盖了广泛的知识点&#xff0c;而且各自的评分标准也是不一样的。为了帮助大家更全面地掌握各类题型的得分规则&#xff0c;睿…

解决:Nacos无法获取远程配置数据,导致项目启动各种配置异常

解决&#xff1a;Nacos无法获取远程配置数据&#xff0c;导致项目启动各种配置异常 一问题描述&#xff1a;1.项目pom依赖版本&#xff1a;2.bootstrap.yml配置信息3.远程配置&#xff1a;默认public命名空间4.启动报异常&#xff0c;显示没有配置数据源&#xff0c;实际远程已…

韦东山嵌入式linux系列-查询方式的按键驱动程序_编写框架

1 LED 驱动回顾 对于 LED&#xff0c; APP 调用 open 函数导致驱动程序的 led_open 函数被调用。在里面&#xff0c;把 GPIO 配置为输出引脚。安装驱动程序后并不意味着会使用对应的硬件&#xff0c;而 APP 要使用对应的硬件&#xff0c;必须先调用 open 函数。所以建议在驱动…