当设计模式牵手LLM

模版方法模式

何为模版设计模式

想象一下 如果我们要泡一杯茶 我们要循序渐进地

  1. 煮水温杯
  2. 注水浸茶
  3. 茶水入杯
  4. 加点配料
如此,泡茶的工序就完成了,那么模板方法模式,相信各位也有了一定的概念:定义了一个算法的骨架,而将一些步骤延迟子类中实现。这样,子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
也就是说 不问你泡什么茶 一些步骤都是不可省略的 那么既然如此 我们就把这些重复的步骤包装起来成为一个骨架 我们需要的时候 就直接用它 当然你也可以加枸杞 或者加柠檬 可以重新定义

代码实现

// 定义 Tea 构造函数,用于创建泡茶的对象 
function Tea(type,add) { this.add=addthis.type = type; console.log('你准备泡一杯' + this.type); 
}

Tea 和其它茶之间没有血缘关系 Tea是原型对象 是可执行对象 负责构建对象 this指向的这些属性就是实例的属性模板

原型

每个JavaScript对象都有一个与之关联的原型(prototype) 这个原型也是一个对象 当试图访问对象的某个属性时 如果对象本身没有这个属性 JavaScript引擎会自动查找对象的原型链 直到找到该属性或者到达原型链的末端

原型链:

原型链是JavaScript实现继承的主要方式 当创建一个对象时 JavaScript引擎会为这个对象设置一个原型 指向其构造函数的原型对象 如果原型对象本身也是一个对象 它也有自己的原型 这样就形成了一个链式结构 称为原型链

Tea通过prototype属性添加方法 以他为原型的对象可以共享

// 在 Tea 对象中使用 prototype 添加方法 
Tea.prototype.boilWater = function () {console.log("把水煮沸")
} 
Tea.prototype.steepBag = function () {console.log("用沸水浸泡茶叶")
} 
Tea.prototype.pourInCap = function () {console.log("把茶水倒进杯子") 
} 
Tea.prototype.addtive = function () { if (this.add!=null) {console.log("加"+this.add)}elseconsole.log("未添加")  
} 
// 定义模板方法 init,它定义了泡茶的整个流程 
Tea.prototype.init = function () { this.boilWater(); this.steepBag();this.pourInCap(); this.addtive(); } 
// 实例化 
var greenTea = new Tea('绿茶','蜂蜜'); 
var wlTea = new Tea('乌龙茶'); 
// 调用模板方法 init 来执行泡茶的流程
greenTea.init();

image.png

这样 我们就可以在各种茶里面加如我们想要的配料 当然 我们还有可以有很多想法 思绪是自由的

优点

  • 封装不变部分,扩展可变部分:模板方法模式将不变的行为搬移到父类中,去除子类中的重复代码,使得子类可以专注于实现自己的特定步骤。
  • 提供了一个很好的代码复用平台:通过模板方法,子类可以复用父类中的代码,同时也可以添加新的行为。

模版模式毫无疑问是很有挖掘价值的,但写到这里 我想到要完成这样一个任务 我们大模型似乎也可以…

//require是node里面的关键字  引入模块
//从本地 node_moudles 引入openai模块
const OpenAI = require('openai')
require('dotenv').config();
//环境变量
// console.log(process.env.OPENAI_API_KEY,'-------');
const client = new OpenAI({apiKey: process.env.OPENAI_KEY,baseURL: 'https://api.chatanywhere.tech/v1'
})
const getChatResponse = async function (model, prompt) {const response = await client.chat.completions.create({model: model, //适合聊天的模型  指定一种模型messages: [{role: 'user',content: prompt}]})return response.choices[0].message.content
}const main = async () => {const text = `泡一杯茶很容易,首先需要把水烧开。在等待的过程中,把茶包放入一个杯子。一旦水烧开了,就把它倒在茶包上,等待一会,让茶包浸泡,几分钟后,取出茶包,如果你愿意,加一些蔗糖或牛奶调味,就这样,你可以享受一杯每位的茶了`const prompt = `你将获得由三个引号括起来的文本。如果它包含了一系列的指令,则需要按照以下格式重新编写这些指令,第一步 - ...第二步 - ......   - ...如果文本不包含一系列指令 则直接写“未提供步骤”""""${text}"""`const chatCompletion = await getChatResponse('gpt-3.5-turbo', prompt)console.log(chatCompletion);
}main();

是的 大模型也可以很僵单地完成任务 大模型自身就具有很强的自然语言处理能力 我想 应该也可以这样

一个自助教程雏形就这样完成了()

const OpenAI = require('openai')
require('dotenv').config();
const client = new OpenAI({apiKey: process.env.OPENAI_KEY,baseURL: 'https://api.chatanywhere.tech/v1'
})
const getChatResponse = async function (model, prompt) {const response = await client.chat.completions.create({model: model, messages: [{role: 'user',content: prompt}]})return response.choices[0].message.content
}function Tea(type, add) {this.type = type;this.add = add || '无';this.process = `我准备泡一杯${this.type}`;
}Tea.prototype.init = function () {this.process += `,需要添加:${this.add}`;return this.process;
}// 实例化
var greenTea = new Tea('卡布奇诺', "甜甜的你");
const main = async () => {const prompt = `你将获得由三个引号括起来的文本。如果它包含一个制作饮料的想法,请你提供步骤如第一步 - ...第二步 - ......   - ...如果文本不包含一个想法 则直接写“没意思”""""${greenTea.init()}"""`const chatCompletion = await getChatResponse('gpt-3.5-turbo', prompt)console.log(chatCompletion);
}
main();

image.png

总结

模式与语言模型(LLM)的结合是一种创新的跨领域应用 它将软件工程的最佳实践与AI的强大自然语言处理能力相结合 为软件开发带来了新的可能性和效率提升 我们也将以此为契机 成就更优秀的我们

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

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

相关文章

UDP的报文结构及其注意事项

1. 概述 UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了一种简单的数据传输服务,不保证数据的可靠传输。在网络通信中,UDP通常用于一些对实时性要求较高、数据量较小、传输延迟较低的应用&#xff0c…

【JVM基础07】——类加载器-什么是类加载器?类加载器有哪些?双亲委派了解吗?

目录 1- 引言:类加载器1-1 类加载器是什么?(What)1-2 为什么要用类加载器? 作用:类加载的过程?(Why) 2- ⭐核心:类加载器详解(How)2-1 类加载器分类2-2 什么是双亲委派模型?2-3 为什么采用双亲委…

Pytorch基础:Tensor的squeeze和unsqueeze方法

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中,squeeze和unsqueeze是Tensor的一个重要方法,同时它们也是torch模块中的一个函数,它们的语法如下所示。 Tensor.…

【SpringBoot】1 Gitee

本项目 Gitee 地址:https://gitee.com/Lin_DH/system idea中可能装个gitee的插件,这样操作起来比较方便。 1)登录 Gitee 官网(https://gitee.com/),新建仓库。 2)复制新建的 Gitee 仓库地址&am…

Unity3D之TextMeshPro使用

文章目录 1. TextMeshPro简介2. TextMeshPro创建3. TextMeshPro脚本中调用4. TextMeshPro字体设置及中文支持过程中出现的一些问题 1. TextMeshPro简介 【官网文档】https://docs.unity.cn/cn/2020.3/Manual/com.unity.textmeshpro.html TextMeshPro 是 Unity 的最终文本解决…

软件测试---Linux

Linux命令使用:为了将来工作中与服务器设备进行交互而准备的技能(远程连接/命令的使用)数据库的使用:MySQL,除了查询动作需要重点掌握以外,其他操作了解即可什么是虚拟机 通过虚拟化技术,在电脑…

Leetcode49. 字母异位词分组(java实现)

今天我来给大家分享的是leetcode49的解题思路,题目描述如下 如果没有做过leetcode242题目的同学,可以先把它做了,会更好理解异位词的概念。 本道题的大题思路是: 首先遍历strs,然后统计每一个数组元素出现的次数&#…

电商数据精细化运营解决方案(18页PPT)

方案介绍: 电商数据精细化运营解决方案通过全面、深入的数据分析与应用,助力电商企业实现精细化管理和精准化营销,从而在激烈的市场竞争中脱颖而出。 部分方案内容:

Prometheus 监控Tomcat等java应用的状态

5月应用服务出现问题,当别的小伙伴问我,有没有Tomcat等应用状态的监控的时候,我有点儿尴尬。所以赶紧抽空部署一下。 在配置之前,就当已经会安装jdk和tomcat了。 一、下载jmx_exporter #linux下 cd /usr/local/prometheus wget …

Debug-018-elementUI-el-tree中通过CSS隐藏任意一项的选择框checkbox

前情提要: 我们项目中使用的是elementUI,业务中经常需要使用到el-tree组件去实现一些有层级关系的功能。现在有一个需求描述一下:首先是这个el-tree是个有checkbox的树,每一子节点都可以被选择,用于去实现一些系统的权…

PHP多场地预定小程序系统源码

一键畅游多地!多场地预定小程序的超实用指南 段落一:【开篇:告别繁琐,预订新体验】 🎉🚀 还在为多个活动或会议的场地预订而头疼不已吗?多场地预定小程序来拯救你啦!它像是一位贴心…

【QT】QT 窗口(菜单栏、工具栏、状态栏、浮动窗口、对话框)

Qt 窗口是通过 QMainWindow类来实现的。 QMainWindow 是一个为用户提供主窗口程序的类,继承自 QWidget 类,并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏(Menu Bar)、多个工具栏(Tool Bars)、…

7.26总结

1.我发现我的界面非常不符合要求,魔改了一下界面 2.在此基础上实现了编辑资料的功能,之前的编辑资料不够用完善,现在将所有数据存入数据库, 然后将更改的图片路径存到了服务端的文件夹,文件名为id更方便获取图片&…

Cuda编程模型中常见的错误检测方法

Cuda编程模型中常见的错误检测方法 1 CUDA错误检测简介2 直接嵌入检测函数2.1 检测函数介绍2.2 使用示例 3 封装在.cuh头文件中嵌入3.1 创建 error.cuh 头文件3.2 在 CUDA 程序中包含 error.cuh 并调用 CHECK 宏3.3 使用示例 1 CUDA错误检测简介 CUDA编程模型中的错误检测是确…

C++ - char*、const char*、char[]、string

const char* const char* 用来定义字符串常量。 char[ ] char型的字符数组是一种定长的数组,存储指定长度的字符序列,数组中的每个元素都是一个char类型的变量,如: char arr[] {h, a, l, l, o, \0}; char c arr[0]; // 访问…

【二叉树 C++DFS】2458. 移除子树后的二叉树高度

本文涉及知识点 二叉树 CDFS LeetCode 2458. 移除子树后的二叉树高度 给你一棵 二叉树 的根节点 root ,树中有 n 个节点。每个节点都可以被分配一个从 1 到 n 且互不相同的值。另给你一个长度为 m 的数组 queries 。 你必须在树上执行 m 个 独立 的查询&#xff…

模式Hash和history

vuerouter有两种路由模式Hash和history。区别:Hash为默认模式,url中包含一个#符号的哈希部分。优势:兼容性好,不需要后端服务器的特殊配置。缺点:不够美观,搜索引擎优化较差。History模式使用的浏览器的His…

C# 写入SQLServer数据库报错SqlException: 不能将值 NULL 插入列 ‘ID‘

private int id; [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]//id自增 public int ID { get > id; set > id value; } 将ID属性下的标识规范由否改成是

STM32-寄存器时钟配置指南

目录 启动 SystemInit SetSysClock 总结 启动 从startup_stm32f0xx.s内的开头的Description可以看到 ;* Description : STM32F051 devices vector table for EWARM toolchain. ;* This module performs: ;* - Set the in…

微信小程序支付流程

前端需要做的事情: 生成平台订单:前端调用接口,向后端传递购买的商品信息、收货人信息,(后端生成平台订单,返回订单编号)获取预付单信息:将订单编号发送给后端后,&#x…