20230725接入层网络总结

0.背景

总结一些无需保密的经验作为总结

20230610企业级web开发特性总结

1.接入层网络

一般web系统都是由接入层网络+业务层网络组成,从用户客户端到业务曾服务的入口这段流量路径通常是人们所说的接入层网络

网络层这中间通常会包括:DNS、X层负载均衡

物理链路上通常会包括三大运营商接入网络、小运营商接入网络、机房间专线、核心交换机互联

相关技术包括虚拟IP、4层/7层网络报文解析等

2.相关总结

一个典型的wen服务接入层网络通常是由 DNS系统、4层负载均衡、7层负载均衡组成

无论是哪层,核心思想都是把多个一样的东西对外表现的”像是”一个,理解了这个就能理解接入层网络的大部分逻辑

在DNS层,DNS可以做到分地区、分运营商进行多IP解析、主备策略、BGP机房策略、健康检查、灾备切换

在网络协议栈第4层,可以将多个IP+端口对外当成一个IP+端口使用,多个IP一般叫做L4RS,一个IP一般叫做L4VIP

当然这一层也会包含负载均衡的策略、健康检查、灾备自动切换等功能

在网络协议栈第7曾,可以将多个host+端口对外当成一个host+端口,host的所在一般叫虚拟主机,多个host+端口一般称作L7RS或serviceIP或RealIP

当然这一层也会包含负载均衡策略、健康检查、灾备自动切换

还有一种特殊流程是L4VIP直通serviceIPs,对于IM类特殊应用就不会都使用7层负载均衡

典型拓扑图如下,敏感信息已虚化处理

20230701kubesphere修复bug方案

0.背景

 

kubesphere有点小bug想修一修,准备搭一个本地的环境。

利用最新版的kubekey已经可以支持搭建自定义域名的harbor当作镜像中心了,利用这个镜像中心可离线或加速安装当前官网文档上的kubersphere和k8s。

当安装完成后进入负责安装的pod内查看来下,发现是/shell-operator在运行,打算从这个东西入手来尝试搞清楚kubesphere的安装和运行逻辑,从而对现有的kubesphere做补丁升级

1.首先搞明白自动安装原理

前置知识:kubectl、shell-operator、python、ansible

https://github.com/kubesphere/ks-installer/blob/20a6daa18adf10410a385b48ab2769e55d8bdee2/Dockerfile.complete#L8 我们可以看到主入口的程序来源是https://github.com/flant/shell-operator  这是一个运行在k8s集群中事件驱动脚本的工具。

根据https://github.com/flant/shell-operator/blob/55ca7a92c873cccfdad0c7591048eaeb8cf0dd4b/docs/src/HOOKS.md?plain=1#L11 描述shell-operator默认会递归扫描hooks目录下的文件把按文件的标准输出当作声明监听event

根据https://github.com/kubesphere/ks-installer/blob/20a6daa18adf10410a385b48ab2769e55d8bdee2/Dockerfile#L5 可知controller下的文件会被放到/hooks下作为监听,其中包括installerRunner.py

https://github.com/kubesphere/ks-installer/blob/20a6daa18adf10410a385b48ab2769e55d8bdee2/controller/installRunner.py#L30C12-L30C32 可知installRunner.py会在ClusterConfiguration创建或更新的时候被触发。

从 https://github.com/kubesphere/kubekey/blob/ffaa19f430a6b13aa219c7ec699fc2ea705c3a93/cmd/kk/pkg/kubesphere/modules.go#L101 可找到这个触发动作

TODO 待详细查看触发动作中yaml是否包含版本参数

https://github.com/kubesphere/ks-installer/blob/20a6daa18adf10410a385b48ab2769e55d8bdee2/controller/installRunner.py#L338C41-L338C53 可以看到实际执行动作的是ansible

2.修改方案

根据上面说明可知控制链路是kubekey->ks-installer->shell-operator->ansible->kubectl->kubesphere服务组件
  1. fork官方代码修改后重新制作镜像,获得一个独立的docker镜像地址+tag
  2. 更新kubesphere服务组件的镜像tag,根据和kubesphere距离可选
    1. 通过修改对应的Pod声明
    2. 通过修改ClusterConfiguration间接触发shell-operator
    3. 通过修改kubekey配置文件

3.bug列表

  1. 多集群管理下,toolkit只显示master集群的kubectl config。https://github.com/kubesphere/kubesphere/issues/5766
  2. toolkit的提示文案未和当前用户身份做匹配,用户无权限的按钮也有提示文案
  3. 筛选某个namespace的资源后,跳转到pvc后过滤条件丢失

20230623esxi自动创建虚机+安装ubuntu

0.背景

做实验需要反复创建虚机装系统,略麻烦。打算给家里云做个低配版的虚机自动化管理

1.方案调研

esxi本身有接口和SDK可以给各种语言做自动化对接,从官方github就能找到不少资料

ubuntu自动安装也比较成熟,常见的方案都是使用cloud-init来提供user-data,可以参考官方文档试试

2.虚机自动创建

使用govc命令行即可,脚本参考https://github.com/vmware/govmomi/blob/main/scripts/vcsa/create-esxi-vm.sh  去掉了对我没用的部分并增加了几个参数方便自己使用,完整文档请参考https://github.com/vmware/govmomi/tree/main/govc#usage

3.ubuntu自动安装

官方的cloud-image.ova我测了好几次都都没法用govc正常传递-options参数,json里指定的user-data并没有生效,不知道为什么,因此先尝试半自动手动修改引导参数测试

3.1.user-data准备

首先按官方文档准备一个目录,放入user-data和user-meta后启动http服务器

user-data内容如下,有这么几点需要注意

  • 开头的第一行注释不要删
  • 在22.04.1这个版本的ubuntu下,如果不加refresh-installer会导致lvm的sizing-policy失效,40G系统盘默认只会用20G。
  • disable_suites如果不加security会导致本地实验老去联网升级安全补丁,为了加快速度我就关了,实际生产环境不要关
  • packages如果指定了内容,package_update无论是什么都会更新一次源

3.2.远程加载user-data

20.04.5的图形界面按F6和esc后可以编辑启动菜单的指令,改成这样就能从远程加载user-data了。

话说不知道为啥vmware粘贴多了会导致有概率内容丢失


22.04.1的那个图形界面没了,可以按c进入grub命令行,手动执行启动参数如下,注意nocloud-net后面的分号之前必须有反斜杠转义

vmware在这个命令行下的粘贴完全没问题

3.3.从网络启动并自定义内核启动参数

1.设置openwrt当DHCP server指定 tftp服务

https://openwrt.org/docs/guide-user/services/tftp.pxe-server

https://forum.openwrt.org/t/solved-dhcp-config-pxe-boot-from-external-tftp-server/5880

配置如下图

2.tftp由op、jumpbox、群晖负责(群晖的tftp测试失败,疑似是因为我的群晖不在测试网段,暂时使用op自带的tftp)

tftp内容制作如下,参考openwrt的文档修改而成。我使用的是BIOS legency引导,示例如下。

注意,根据https://askubuntu.com/questions/1235723/automated-20-04-server-installation-using-pxe-and-live-server-image中描述

使用cloud-config-url=/dev/null可以降低内存的使用要求

3.autoinstall的user-data和iso文件由jumpbox或omv负责提供

如上面参数所示临时用python启动了一个http服务器放在了http://192.168.2.159/iso/ubuntu-22.04.1-live-server-amd64.iso,后面考虑换成omv或群晖提供。理论上这里过了DHCP过程因此不受测试网段的限制才对

尝试使用cdrom挂载iso但使用pxe修改内核参数从光驱执行自动安装

https://www.cnblogs.com/xyshun/p/9427472.html

https://www.dddns.icu/posts/pxe/

https://github.com/pypxe/PyPXE

https://github.com/netbootxyz/netboot.xyz

4.全自动化

1.esxi自动化由govc搞定,创建后可拿到网卡mac地址

虚机创建见前面的脚本

从cdrom安装这种方式需要修改bios启动顺序才行,disk>net>cd-rom,disk放第一个是防止安装成功后还重复执行安装,net比cd-rom靠前是因为避免自动进光盘页面无法走自动化。

2.通过mac地址可控制openwrt的tftp按mac地址返回引导选项

自动获取mac如下

编写脚本按mac和hostname动态生成引导菜单并上传到tftp

注意文件名应该以01-开头,详见https://wiki.syslinux.org/wiki/index.php?title=PXELINUX

还可以用16进制的ip地址,总规则是

After attempting the file as specified in the DHCP or hardcoded options, PXELINUX will probe the following paths, prefixed with “pxelinux.cfg/“, under the initial Working Directory.

  • The client UUID, if provided by the PXE stack.
Note that some BIOSes do not have a valid UUID, and it might end up reporting something like all 1’s.
This value is represented in the standard UUID format using lowercase hexadecimal digits, e.g. “b8945908-d6a6-41a9-611d-74a6ab80b83d“.
  • The hardware type (using its ARP “htype” code) and address, all in lowercase hexadecimal with dash separators.
For example, for an Ethernet (i.e. ARP hardware type “1“) with address “88:99:AA:BB:CC:DD“, it would search for the filename “01-88-99-aa-bb-cc-dd“.
  • The client’s own IPv4 address in uppercase hexadecimal, followed by removing hex characters, one at a time, from the end. For example, “192.168.2.91” → “C0A8025B“.
The included program, “gethostip“, can be used to compute the hexadecimal IP address for any host.
  • Lowercase “default“.

3.引导选项中的iso暂时由群晖webstaion提供

静态站点,无需多言

暂时不需要了,ramdisk有问题。使用ramdisk加载iso后安装很慢,应该是我给的内存太少了。

4.引导选项中的autoinstall配置文件也由webstation提供

群晖自带的webstation可以用PHP,打算尝试使用PHP测试伪静态

使/prefix/{hostname}/user-data可按我指定的模板返回,并动态替换hostname

找到webstation的主nginxconfg文件,/var/tmp/nginx/app.d/server.webstation-vhost.conf,可以看到有include

按路径新建一个 /usr/local/etc/nginx/conf.d/blablablabla/user.conf

/usr/local/etc/nginx/conf.d/a9d1c5c8-082a-482c-8fe1-73afc670ff6c/user.conf

感谢eric提供的参考

编写index.php如下

 

参考

https://ubuntu.com/server/docs/install/autoinstall

https://github.com/hedzr/pxe-server-and-focal

https://hedzr.com/devops/linux/build-pxe-server-and-autoinstall-ubuntu-server

https://github.com/vmware/govmomi/blob/main/govc/README.md

https://blog.amrom.tk/2022/2022-03-03-esxi-cloud-init/

https://cloudinit.readthedocs.io/en/latest/topics/examples.html

https://nickhowell.uk/2020/05/01/Automating-Ubuntu2004-Images/

https://discourse.ubuntu.com/t/automated-server-installer-config-file-reference/16613/42

http://hmli.ustc.edu.cn/doc/linux/ubuntu-autoinstall/ubuntu-autoinstall.html

 

 

20230622mysql in k8s

0.背景

视频版 TODO 待录制

原计划是从手动到容器化再到云原生,每种阶段的搭建方式都来一次,但实际上容器化和云原生基本上没什么太大差距。因此跳过容器化阶段直接进入云原生的数据库搭建。

mysql属于有状态的应用,因此它的存储在一般的docker中需要特殊处理。有一种说法是没有必要在docker中搭建mysql,这个说法不完全对,在测试环境容器化可以带来很大的灵活性。实际上生产环境下上只要存储弄好了之后利用k8s的资源管理和调度能力是可以搭出合适的mysql集群的

其实前段时间已经给paraparty的群服务器搭过一次了,这里是总结下经验,详细记录请参考https://paraparty.feishu.cn/docx/FsBNdoDQAo4E8VxN0zZceTP8nsh

1.前期准备

在k8s中搭建mysql架构如图,来自官方的文档,直接照着搭即可。版本选择 8.0.33

MySQL、Kubernetes 通用术语. 例如Node可能代指一个Kubernetes Node或一个MySQL Node,Cluster可能代指一个MySQL InnoDB集群或Kubernetes集群,ReplicaSet是MySQL和Kubernetes都有的一个特性。

1.1.计算资源

  • k8s系统使用Controllers来管理Pod(在其中运行的容器化负载)的生命周期。Controllers是一个通用工具提供了广泛的服务能力,但复杂的服务需要包括operator之类额外的组件。Operator是一个运行在k8s集群中的软件和k8s-api进行交互来观测资源和服务来协助k8s进行生命周期的管理
  • MySQL Operator for Kubernetes 是一个专注于管理一个或多个由MySQL Server组成的MySQL InnoDB集群和MySQL Routers的工具。它自身在k8s集群中运行并作为k8s Deployment被管理,以此来保证自身的可用性 默认情况下它被部署在’mysql-operator’的k8s命名空间内,并监视k8s集群中所有的InnoDB集群和相关联的资源,为了执行这些任务operator订阅k8s-api服务来更新事件并按需连接到被管理的MySQL Server实例上。在k8s-controller的最顶层operator配置MySQL servers,使用Group Replication配置高可用集群,以及Mysql Router
  • MySQL InnoDB Cluster 一旦InnoDB Cluster (InnoDBCluster) 资源被部署到k8s-api上,Operator会创建如下的资源: k8s-StatefulSet来运行MySQL Server实例 他们管理Pods并分配相关的存储卷(storage Volume,sc),这个StatefulSet运行多个容器作为Pod,每个Pod都被其管理。 开始的几个提供一系列的初始化步骤来准备MySQL Server的配置和数据文件夹,紧接着两个容器作为业务容器保持存活。其中一个名为mysql的容器运行MySQL Server本体,另一个名为sidecar的容器来和operator写作负责节点的本地管理
  • k8s-Deployment来运行MySQL Routers MySQL Routers是无服务的状态应用,依照客户端要求来转发流量到当前的主节点或从节点,operator可以调整router的数量来根据实际的情况扩容或缩容

1.2.服务暴露

  • 一个MySQL InnoDB集群部署会创建如下的k8s-Services: 一个名为InnoDB Cluster的服务,它负责作为MySQL Router的主入口。同时提供了一个固定的本地DNS域名,格式为'{clustername}.svc.cluster.local’,并同时暴露需要的端口 详细信息查看官网文档 “MySQL InnoDB Cluster Service Explanation” and Connecting to MySQL InnoDB Cluster.
  • 第二个名为'{clustername}-instances’的服务为每个独立的实例提供了固定的本地DNS域名。一般来说他们不应该被直接访问,而应该使用主服务的域名来保证访问到正确的主节点或从节点。然而,为了运维或或监控来使用这个域名是有必要的,每个pod上都预装了MySQL Shell
  • Operator 创建和管理的其他资源不应该被手动修改,包括: 名为'{clustername}-initconf’的k8s-ConfigMap包括了MySQL 服务的配置信息,想要修改生成的my.cnf配置文件,查看 “Manifest Changes for InnoDBCluster”. 一系列k8s-Secrets用于存储系统不同部分的凭证, 名字是 ‘{clustername}.backup’, ‘{clustername.privsecrets}’, and ‘{clustername.router}’.
  • 获取operator创建的MySQL账号和关联的密码,查看 “MySQL Accounts Created by InnoDBCluster Deployment”.

2.mysql-operator

如架构图所示,mysql-operator负责具体pod的创建和维护,因此需要先安装mysql-operator,文档参考官方文档

2.1.原理追踪

简单来说mysql-operator是一个给mysqlsh开发的python模块,它会启动一个python脚本通过kopf监听k8s集群资源变动的事件并执行预定义的操作
详细追踪过程如下:
集群部署的mysql-operator会启动mysqlsh,利用–pym加载外部名为mysqloperator的python模块

这个模块在community-operator镜像制作的时候会被打进去,关键命令是COPY mysqloperator/ /usr/lib/mysqlsh/python-packages/mysqloperator

https://github.com/mysql/mysql-operator/blob/a711f0d08dc7097778c1417779146c8ce89721c4/docker-build/Dockerfile#L19
默认指定的参数是operator,根据mod = importlib.import_module(entrypoints[sys.argv[1]], "mysqloperator")可以定位到operator_main.py
https://github.com/mysql/mysql-operator/blob/a711f0d08dc7097778c1417779146c8ce89721c4/mysqloperator/__main__.py#L25
https://github.com/mysql/mysql-operator/blob/a711f0d08dc7097778c1417779146c8ce89721c4/mysqloperator/operator_main.py#L46
根据这个可以确定mysql-operator使用的是kpof来监听k8s集群事件的
kpof官方文档 https://kopf.readthedocs.io/en/stable/
kpof源码https://github.com/nolar/kopf
根据operator_xxx.py的命名风格猜测operator_cluster.py是我要找的内容,点开后可以明显看到@kopf.on.create 装饰器(py里叫decorator,java叫注解)
官方文档参考https://kopf.readthedocs.io/en/stable/handlers/#registering
https://github.com/mysql/mysql-operator/blob/a711f0d08dc7097778c1417779146c8ce89721c4/mysqloperator/controller/innodbcluster/operator_cluster.py#L52
往下翻翻很容易看到statefulset = cluster_objects.prepare_cluster_stateful_set(icspec, logger)
https://github.com/mysql/mysql-operator/blob/a711f0d08dc7097778c1417779146c8ce89721c4/mysqloperator/controller/innodbcluster/operator_cluster.py#L165
跳转到cluster_objects.py很容易发现yaml定义了
https://github.com/mysql/mysql-operator/blob/a711f0d08dc7097778c1417779146c8ce89721c4/mysqloperator/controller/innodbcluster/cluster_objects.py#L226
保险起见往下追一层,同理根据一样的原则很容易追到init对应的python代码是在init_main.py的main
parser.add_argument('--datadir', type = str, default = "/var/lib/mysql", help = "Path do data directory")
https://github.com/mysql/mysql-operator/blob/a711f0d08dc7097778c1417779146c8ce89721c4/mysqloperator/init_main.py#L77

2.2.mysqlsh的使用

文档 https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-features.html
除了root的密码可以作为运维使用之外,localroot在sidecar中也可以使用,虽然官方不建议但是这个省事。其他账号参考https://dev.mysql.com/doc/mysql-operator/en/mysql-operator-mysql-accounts.html
localroot的sock放在了/var/run/mysqld/mysql.sock/var/run/mysqld/mysqlx.sock,通过以下方式可进入shell且无需密码
  • 执行mysqlsh 'localroot@(/var/run/mysqld/mysql.sock)'
  • mysqlsh下执行\connect localroot@(/var/run/mysqld/mysql.sock)
  • 其他语法可参考https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-connection-socket.html

3.部署记录

https://dev.mysql.com/doc/mysql-operator/en/mysql-operator-innodbcluster-common.html

创建以下资源即可间接控制mysql-operator搭建集群

详细配置可以参考https://dev.mysql.com/doc/mysql-operator/en/mysql-operator-innodbcluster-simple-kubectl.html

假设namespace是mysql-test,集群名是cluster1的话,创建完成后会暴露如下内网域名

检查集群状态

集群创建后会有几个默认账号,一般建议用root作为超管使用。如前面步骤所示root是存在secret里的,其他的几个账户也是在相同的位置。mysqlbackup、mysqlrouter、mysqladmin这几个账户的密码都能从test1-backuptest1-routertest1-privsecrets中找到。其他账户请参考1.2中的链接

 

20230619离线导入导出镜像

 

20230610企业级web开发特性总结

0.前言

做了这么久web开发,先后接触过不少python、Java、C#、Js、Kotlin、Go等主流语言的web开发框架,但其实时间长了会发现企业级web开发的特性要求是固定的,各个语言和框架都有自己的方案但殊途同归。特此做个总结系列,相对系统的梳理和回忆下我的知识。以下特性不限于单一语言,从架构设计上考量的话,只要满足相关特性即可,这是语言无关的,只要能达成既定的技术目标就好。

因为其中每点都能拿出来单独展开,因此第一版暂时开坑写个提纲,然后看我心情慢慢填坑

1.接入层网络特性

DNS分地区多IP解析+健康检查+灾备自动切换
L4VIP-L4RS四层负载均衡+健康检查+灾备自动切换
L4RS-L7IPs七层负载均衡+健康检查+灾备自动切换
L7IPs-serviceIPs负载均衡+健康检查+灾备自动切换
L4VIP直通serviceIPs

2.DevOps特性

监听代码变动
容器化打包
平滑关机
健康检查
流量路由
多环境打包

3.应用能力特性

服务注册
服务发现

mesh RPC能力
日志框架
本地、远程配置文件读取
统一结果类建模
序列化框架
应用声明周期监听(启动/退出/重启事件)
请求统一拦截器Interceptor
统一异常处理返回值
国际化
请求追踪能力 ThreadLocal
通用RouterMapping,支持路径前缀前缀复用到Class注解上
MVC解析HTTP报文,queryString,pathVariable,jsonBody
本地内存或分布式EventBus
本地内存缓存
分布式消息队列
分布式内存缓存
切面拦截能力
方法异步调用
定时任务调度
单元测试能力
依赖注入能力
资源池化能力
mysql数据库集成
mongo数据库集成
多数据源、故障自动切换
读写分离
存储层ORM、OGM

20230515LLM笔记

0.前言

先叠个盾:我AI水平有限,哪写的不对欢迎大佬指正。

1.原理

LLM是根据上文预测下一个最大可能性的token,直到语句结束或超长。常见的对话只是表现形式的一种,实际运行的原理是对文本的补全预测。
关于部分人对于模型表现出的行为产生了偏离实际的想法,需要强调现在的模型还没有记忆,时刻记得无论输出什么内容,即使行为再像一个人,它也依旧是静态的
训练数据里是把对话作为整体的,因此当你输入的内容被拼接成训练数据里的前半部分,模型就会根据输入补全后面的内容,这部分内容再以回复的形式展现到聊天框。下一句你发送的内容的前面会被拼接上之前所有的历史记录输入到模型中进行下一次预测,表现出的记忆能力是这样做到的,并不是模型本身有记忆。

2.prompt方案

2.1.Input-output (IO) prompting

最原始的prompt方法,直接向模型输入prompt,并得到输出

2.2.embedding + 向量数据库

当输入的prompt超过模型长度限制后,一个方向是增加模型的context,比如GPT4能到32k,实测足够传递很长的信息给它了,但如果还不够
另一个方向就是缩减prompt的长度。
embedding可以使文本转为向量,利用向量数据库存储大量内容,在构造prompt时使用向量搜索相关信息动态拼接prompt,可以用来减少prompt长度完成大容量知识库的搜索
早在2018毕业的时候就有同学使用word2vec生成词向量并做文本的情感分析,原理类似。
但这里有问题需要注意,词向量本身有个维度是N,一个句子会被分为多个词,怎么把句子转成一个向量需要根据不同场景选择策略
例如CoSENT(Cosine Sentence) model可以做到将句子映射到768维的稠密向量
以下是GPT的回答
Based on the description you provided, the “CoSENT” or “Cosine Sentence” model appears to be a sentence encoder that maps sentences into a 768-dimensional dense vector space. This type of model is often used for tasks such as sentence embeddings, text matching, or semantic search.
Sentence embedding models like “CoSENT” aim to capture the semantic meaning of sentences and represent them as fixed-length vectors in a high-dimensional space. These vectors can then be used for various natural language processing tasks, including similarity comparison, clustering, or retrieval.
While I’m not familiar with the specific details and architecture of the “CoSENT” model, based on the functionality you described, it seems to fall under the category of language models. Language models, including both generative models like ChatGPT and encoder models like “CoSENT,” contribute to the broader field of natural language processing and understanding.

参考资料

https://github.com/facebookresearch/dinov2
常见的向量数据库 https://python.langchain.com/en/latest/modules/indexes/vectorstores.html

3.prompt技巧

3.1.通用技巧

清晰的描述问题,包括合理使用界符分隔数据和指令

3.2.few-shot prompting

在prompt中提供部分例子可以得到更好的效果
Language models are few-shot learners. NeurIPS.
https://proceedings.neurips.cc/paper/2020/file/1457c0d6bfcb4967418bfb8ac142f64a-Paper.pdf
https://zhuanlan.zhihu.com/p/200978538

3.2.CoT prompting

在prompt中说明请逐步思考并提供部分示例
英文let’s think step by step
Chain of Thought https://arxiv.org/pdf/2203.11171.pdf

Self-consistency with CoT (CoT-SC)

https://arxiv.org/pdf/2203.11171.pdf
https://zhuanlan.zhihu.com/p/609739922

采样方法

temperature sampling (Ackley et al., 1985; Ficler & Goldberg, 2017),
top-k sampling (Fanet al., 2018; Holtzman et al., 2018; Radford et al., 2019)
nucleus sampling (Holtzman et al.2020)
Sample-and-Rank
Beam Search
Ensemble-based Approaches
概率论概念:
边缘化 https://cloud.tencent.com/developer/article/1096441

Auto CoT

为了缓解手动设计的困难,Auto-CoT方法自动构建具有questions和reasons chains的演示。

3.3.USP 自适应prompt

一个通用的自适应prompt方法,突破了零样本学习的瓶颈

  • 谷歌提出了一种 Universal Self-adaptive Prompting (USP) 方法,对LLMs的零样本学习进行了优化,同时也适用于少样本学习任务。USP只需要少量未标记的数据,就能大幅提升LLMs在20多个自然语言理解和生成任务上的表现。实际上,结果比起少样本基线方法甚至更好!
  • 论文:Universal Self-adaptive Prompting

4.能力扩充

4.1.和外界交互的能力

Toolformer
https://arxiv.org/pdf/2302.04761.pdf
On the other hand, recent work has explored the use of pre-trained language models for planning and acting in interactive environments (Ahn et al., 2022; Nakano et al., 2021; Yao et al., 2020; Huang et al., 2022a),

4.2.支持AI自主制造工具

待收集资料+测试
https://arxiv.org/pdf/2305.17126.pdf

5.多次prompt组合调度

5.1.ToT 增加回溯、全局计划能力

https://arxiv.org/pdf/2305.10601.pdf
https://github.com/ysymyth/tree-of-thought-llm

3.2.ReAct范式

Thought Act Observation,让AI思考、行动、观察并重复这个过程
https://arxiv.org/abs/2210.03629

5.3.多步骤推理自动生成框架ART

《ART: Automatic multi-step reasoning and tool-use for large language models》
https://link.zhihu.com/?target=https%3A//arxiv.org/abs/2303.09014

6.服务层实现框架

6.1.LangChain增加调度逻辑、支持外部工具调用

https://github.com/hwchase17/langchain
https://liaokong.gitbook.io/llm-kai-fa-jiao-cheng/#vectorstores-xiang-liang-shu-ju-ku
https://python.langchain.com/en/latest/modules/indexes/vectorstores/examples/chroma.html#persistance
SayCan dataset (Ahn et al., 2022) 包含自然语言指令 到 机器人动作序列 的映射

参考

https://wqw547243068.github.io/prompt