STaR: Bootstrapping Reasoning With Reasoning

STaR: Bootstrapping Reasoning With Reasoning

基本信息

博客贡献人

燕青

作者

Eric Zelikman, Yuhuai Wu, Jesse Mu, et al. from Stanford University and Google Research

标签

Large Language Model, Chain-of-thought, Fine-tuning

摘要

生成逐步的“思维链”逻辑依据(rationale)可以提高语言模型在数学或常识问答等复杂推理任务上的性能。然而,诱导语言模型进行逻辑依据生成需要构建大量逻辑依据数据集,或者仅使用few-shot推理来牺牲准确性。本文提出了一种技术来迭代地利用少量的逻辑依据示例和没有逻辑依据的大型数据集,以引导连续执行更复杂的推理的能力。这种技术称为“自学推理机”(STaR),依赖于一个简单的循环:生成回答许多问题的逻辑依据,并用一些逻辑依据示例进行提示;如果生成的答案是错误的,请在给出正确答案的情况下再次尝试生成理由;对最终产生正确答案的所有逻辑依据进行微调;重复上述过程。本文表明,与经过微调以直接预测最终答案的模型相比,STaR 显着提高了多个数据集上的性能,并且其性能与在 CommensenseQA 上微调 30 倍大的最先进语言模型相当。因此,STAR 让模型通过学习自己生成的推理来改进自身。

问题定义

人类的决策通常是思想链延伸的结果。最近的工作表明,显式中间推理(“逻辑依据”)也可以提高大语言模型(LLM)的性能。在给出最终答案之前生成明确的逻辑依据(rationale generation,逻辑依据生成)对于LLM在数学推理、常识推理、代码评估、社会偏见推理和自然语言推理等不同任务中很有价值。然而,诱导基本原理生成的两种主要方法都有严重的缺点。

逻辑依据生成的一种方法是构建一个微调的逻辑依据数据集,要么由人工标注人员手动标注,要么通过手工制作的模板自动标注。人工方法成本高昂,且无法为每个不同领域的问题构建这样的数据集。同时,基于模板的方法依赖于自动生成逻辑依据,只有在模版匹配的特定条件下才能发挥作用。

另一种方法是通过在语言模型prompt中只包含少量的逻辑依据示例(few-shot)来利用语境学习。与无逻辑依据的prompt相比,其被证明可以提高数学和符号推理任务的准确性。然而,虽然带有逻辑依据推理的few-shot技术往往优于不进行推理的对应技术,但它们的表现通常远不如使用较大数据集微调后直接预测答案的模型。

本文采用了一种不同的方法:通过利用LLM预先存在的推理能力,迭代地引导LLM生成高质量逻辑依据的能力。具体来说,本文通过小样本提示LLM来自我生成逻辑依据并通过微调那些导致正确答案的理由来进一步完善模型的能力。重复这个过程,每次使用改进的模型生成下一个训练集。这是一个协同的过程,逻辑依据生成的改进改善了训练数据,训练数据的改进又进一步改善了逻辑依据生成。

然而,本文发现这个循环最终没有解决训练集中的任何新问题,因为它没有接收到它未能解决的问题的直接训练信号。为了克服这个问题,本文提出逻辑依据化(rationalization):对于模型不能正确回答的每一个问题,通过提供模型正确的答案来生成新的逻辑依据。这让模型反向推理——给出正确答案,模型就能更容易地生成有用的逻辑依据。然后收集这些逻辑依据作为训练数据的一部分,这往往会提高整体的准确性。

因此,本文开发了自学习推理机(STaR,如图1所示)方法,这是一种可扩展的自学方法,允许模型学习生成自己的逻辑依据,同时也学习解决越来越困难的问题。在本文的方法中,重复以下过程:在每次迭代中,首先通过尝试使用当前模型的基本原理生成能力来求解数据集**(能够正确解决的问题),从而构建一个微调数据集;然后,使用合理化方法扩充该数据集(不能正确解决的问题)**,以证明模型未能解决的问题的真实答案;最后,在组合数据集上微调大语言模型。

1
图1. STaR概述及逻辑依据化原理
问题和答案来自原始数据集,而逻辑依据使用STaR生成。

方法

逻辑依据生成引导

给定一个预训练的LLM M M M 和一个问题 x x x 的初始数据集,其答案为 y : D = { ( x i , y i ) } i = 1 D y:\mathcal{D} = \{ ( x_i , y_i) \}^D_{i=1} yD={(xi,yi)}i=1D​</

<think>问题分析:错误信息 "Bootstrappingof Routerwith multiplemetadata_cachesections notsupported"表明在引导过程中,MySQL Router检测到了多个 `metadata_cache`配置段,而目前不支持在引导时配置多个`metadata_cache`段。根据提供的命令,您使用了`--conf-set-option=metadata_cache:Cluster01.bootstrap_server_addresses=...`来设置一个名为 `Cluster01`的 `metadata_cache`段。但是,如果配置文件中已经存在其他`metadata_cache`段,或者您在引导命令中尝试设置多个`metadata_cache`段,就会导致这个错误。在MySQL Router8.0中,引导过程通常只支持一个 `metadata_cache`段。您可能不需要指定多个,除非您有多个集群。但根据您的命令,您只设置了一个名为`Cluster01`的`metadata_cache`段,所以这个错误可能是由于以下原因之一:1.之前引导生成的配置文件已经包含了一个 `metadata_cache`段,而您再次引导时又添加了一个。2.在引导命令中,您可能无意中设置了多个 `metadata_cache`段(但根据您提供的命令,只看到一个)。解决方案:1.清除旧的配置文件:在重新引导之前,确保挂载的配置文件目录是空的,或者使用新的目录。2.避免在引导命令中设置多个 `metadata_cache`段:确保只设置一个`metadata_cache`段。3.如果确实需要多个集群,请注意在引导后手动编辑配置文件添加,但引导时只允许一个。修改后的命令建议:我们将使用一个全新的目录挂载,并确保在引导前目录为空。同时,我们只设置一个`metadata_cache`段。步骤:1.在宿主机上创建一个新的目录用于存放配置文件,并设置权限。2.运行容器时挂载这个新目录。3.在引导命令中只设置一个`metadata_cache`段。但是,根据您提供的命令,您已经只设置了一个`metadata_cache`段(Cluster01)。所以问题可能是由于之前引导留下的配置文件导致的。因此,我们首先尝试清理挂载目录,然后重新运行。具体命令调整如下:```bash#1.清理旧的配置文件(确保重新引导时配置目录为空)sudo rm-rf/use01/docker/mysqlrouter/* sudochown-R999:999/use01/docker/mysqlrouter#确保权限正确#2.运行容器,并挂载状态目录(如果之前出现状态目录问题,也一并处理) dockerrun --name mysql-router \--network mysql-net \-v /use01/docker/mysqlrouter:/etc/mysqlrouter\-v/use01/docker/mysqlrouter-state:/var/lib/mysqlrouter \-e MYSQL_HOST=mysql-master \-e MYSQL_PORT=3306\-eMYSQL_USER=mgr_user \-eMYSQL_PASSWORD='admin'\mysql/mysql-router:8.0.32\mysqlrouter\--bootstrap mgr_user:admin@mysql-master:3306 \--conf-set-option=DEFAULT.name=router \--conf-set-option=metadata_cache:Cluster01.bootstrap_server_addresses=mysql-master:3306,mysql-slave1:3306,mysql-slave2:3306\--conf-set-option=routing:read_write.bind_port=6446 \--conf-set-option=routing:read_only.bind_port=6447\--conf-set-option=routing:read_write_split.bind_port=6450\--force```如果问题仍然存在,可能是由于在引导过程中,默认的配置文件模板中已经包含了一个 `metadata_cache`段。我们可以尝试不设置 `metadata_cache`段,因为引导过程会自动从集群中获取元数据服务器地址。或者,我们尝试使用更简洁的命令,只设置必要的选项。替代方案:省略`metadata_cache`的设置,因为引导过程会自动配置。根据 MySQLRouter文档,当使用 `--bootstrap`时,它会自动从集群中获取元数据服务器地址,并写入配置文件。因此,我们可以尝试去掉`--conf-set-option=metadata_cache:...`这一行,让引导过程自动配置。修改后的命令: ```bashdocker run--namemysql-router\--networkmysql-net\-v/use01/docker/mysqlrouter:/etc/mysqlrouter \-v /use01/docker/mysqlrouter-state:/var/lib/mysqlrouter\-eMYSQL_HOST=mysql-master\-eMYSQL_PORT=3306 \-eMYSQL_USER=mgr_user \-eMYSQL_PASSWORD='admin'\mysql/mysql-router:8.0.32\mysqlrouter\--bootstrap mgr_user:admin@mysql-master:3306 \--conf-set-option=DEFAULT.name=router \--conf-set-option=routing:read_write.bind_port=6446\--conf-set-option=routing:read_only.bind_port=6447 \--conf-set-option=routing:read_write_split.bind_port=6450 \--force```这样,引导过程将自动配置`metadata_cache`段,使用从集群中获取的服务器地址。如果仍然需要指定多个服务器地址,可以尝试在引导后手动编辑配置文件,添加多个服务器地址。但请注意,在同一个`metadata_cache`段中,可以指定多个服务器地址,用逗号分隔(您之前已经这样做了)。所以,自动配置应该会正确设置。另外,检查MySQLRouter的日志以获取更多错误信息:```bashdockerlogs mysql-router```如果问题依旧,可能需要检查MySQL集群的状态,确保`mgr_user`有足够的权限,并且集群是健康的。如果上述方法都不能解决问题,我们可以尝试在引导命令中不使用 `--conf-set-option`来设置 `metadata_cache`,而是使用`--conf-use-sockets`或 `--conf-base-port`等选项,或者使用一个预先准备好的配置文件模板。然而,最简单的方式是让引导过程自动生成配置。因此,我们优先推荐省略`metadata_cache`的设置。最终,我们给出一个完整的解决方案,包括清理步骤和简化后的命令。完整步骤: ```bash#步骤1:清理配置文件目录和状态目录sudo rm-rf/use01/docker/mysqlrouter/* sudorm -rf /use01/docker/mysqlrouter-state/* sudochown-R999:999/use01/docker/mysqlroutersudochown-R999:999/use01/docker/mysqlrouter-state#步骤2:运行容器,省略 metadata_cache的设置docker run--name mysql-router \--network mysql-net \-v /use01/docker/mysqlrouter:/etc/mysqlrouter\-v/use01/docker/mysqlrouter-state:/var/lib/mysqlrouter \-e MYSQL_HOST=mysql-master \-e MYSQL_PORT=3306\-eMYSQL_USER=mgr_user \-eMYSQL_PASSWORD='admin'\mysql/mysql-router:8.0.32\mysqlrouter\--bootstrap mgr_user:admin@mysql-master:3306 \--conf-set-option=DEFAULT.name=router \--conf-set-option=routing:read_write.bind_port=6446\--conf-set-option=routing:read_only.bind_port=6447 \--conf-set-option=routing:read_write_split.bind_port=6450\--force```注意:如果引导成功,您可以在挂载的配置文件目录中看到生成的`mysqlrouter.conf`文件,其中`metadata_cache`段是由引导过程自动生成的。如果上述方法无效,可以考虑使用一个自定义的配置文件,然后挂载进去,但这样就不需要引导了。不过,这超出了当前问题的范围。希望这个解决方案能够解决您的问题。§§相关问题§§: 1.如何诊断和解决 MySQLRouter引导过程中的常见错误?2.在 Docker中如何正确清理和重新初始化 MySQLRouter的配置? 3. MySQLRouter的配置文件结构是怎样的?各个配置段的作用是什么? 4.如何为MySQL InnoDBCluster配置多个路由端点?</think>### 解决 MySQL Router 多个 metadata_cache 段引导错误 错误信息 `Error: Bootstrapping of Router with multiple metadata_cache sections not supported` 表明 MySQL Router 在引导过程中检测到多个 `metadata_cache` 配置段,但当前版本不支持这种配置。以下是完整的解决方案: #### 问题分析 1. **核心问题**:MySQL Router 8.0 在引导时只支持单个 `metadata_cache` 配置段 2. **常见原因**: - 配置文件中存在多个 `metadata_cache` 段 - 引导命令尝试设置多个元数据缓存段 - 之前的引导操作残留了旧的配置文件 3. **版本限制**:MySQL Router 8.0.32 不支持引导时配置多个集群 #### 解决方案 ##### 1. 简化配置为单个 metadata_cache 段 ```bash # 使用单个 metadata_cache 段 docker run --name mysql-router \ --network mysql-net \ -v /use01/docker/mysqlrouter:/etc/mysqlrouter \ -v /use01/docker/mysqlrouter-state:/var/lib/mysqlrouter \ -e MYSQL_HOST=mysql-master \ -e MYSQL_PORT=3306 \ -e MYSQL_USER=mgr_user \ -e MYSQL_PASSWORD='admin' \ mysql/mysql-router:8.0.32 \ mysqlrouter \ --bootstrap mgr_user:admin@mysql-master:3306 \ --conf-set-option=DEFAULT.name=router \ --conf-set-option=metadata_cache:bootstrap_server_addresses=mysql-master:3306 \ --conf-set-option=routing:read_write.bind_port=6446 \ --conf-set-option=routing:read_only.bind_port=6447 \ --conf-set-option=routing:read_write_split.bind_port=6450 \ --force ``` **关键修改:** - 使用单个 `metadata_cache` 段,不指定段名 - 只设置一个引导服务器地址(集群会自动发现其他节点) ##### 2. 使用集群名称自动发现节点 ```bash # 让 Router 自动发现集群节点 docker run --name mysql-router \ --network mysql-net \ -v /use01/docker/mysqlrouter:/etc/mysqlrouter \ -v /use01/docker/mysqlrouter-state:/var/lib/mysqlrouter \ -e MYSQL_HOST=mysql-master \ -e MYSQL_PORT=3306 \ -e MYSQL_USER=mgr_user \ -e MYSQL_PASSWORD='admin' \ mysql/mysql-router:8.0.32 \ mysqlrouter \ --bootstrap mgr_user:admin@mysql-master:3306 \ --conf-use-sockets \ --conf-base-port=6446 \ --force ``` ##### 3. 引导后手动添加多个集群(高级) ```bash # 第一步:引导基本配置 docker run --name mysql-router \ --network mysql-net \ -v /use01/docker/mysqlrouter:/etc/mysqlrouter \ -v /use01/docker/mysqlrouter-state:/var/lib/mysqlrouter \ -e MYSQL_HOST=mysql-master \ -e MYSQL_PORT=3306 \ -e MYSQL_USER=mgr_user \ -e MYSQL_PASSWORD='admin' \ mysql/mysql-router:8.0.32 \ mysqlrouter \ --bootstrap mgr_user:admin@mysql-master:3306 \ --directory /tmp \ --force # 第二步:手动编辑配置文件 cat << EOF > /use01/docker/mysqlrouter/mysqlrouter.conf [DEFAULT] name=router logging_folder=/var/log/mysqlrouter runtime_folder=/var/run/mysqlrouter config_folder=/etc/mysqlrouter data_folder=/var/lib/mysqlrouter [metadata_cache:cluster01] bootstrap_server_addresses=mysql-master:3306,mysql-slave1:3306,mysql-slave2:3306 user=mgr_user metadata_cluster=cluster01 ttl=5 [routing:read_write] bind_address=0.0.0.0 bind_port=6446 destinations=metadata-cache://cluster01/default?role=PRIMARY routing_strategy=first-available [routing:read_only] bind_address=0.0.0.0 bind_port=6447 destinations=metadata-cache://cluster01/default?role=SECONDARY routing_strategy=round-robin [routing:read_write_split] bind_address=0.0.0.0 bind_port=6450 destinations=metadata-cache://cluster01/default?role=PRIMARY_AND_SECONDARY routing_strategy=round-robin EOF # 第三步:使用自定义配置运行 docker run -d --name mysql-router \ --network mysql-net \ -v /use01/docker/mysqlrouter:/etc/mysqlrouter \ -v /use01/docker/mysqlrouter-state:/var/lib/mysqlrouter \ -p 6446:6446 -p 6447:6447 -p 6450:6450 \ mysql/mysql-router:8.0.32 ``` ##### 4. 使用 Docker Compose 简化部署 ```yaml version: '3.8' services: mysql-router: image: mysql/mysql-router:8.0.32 container_name: mysql-router depends_on: - mysql-master environment: MYSQL_HOST: mysql-master MYSQL_PORT: 3306 MYSQL_USER: mgr_user MYSQL_PASSWORD: admin volumes: - mysqlrouter_config:/etc/mysqlrouter - mysqlrouter_state:/var/lib/mysqlrouter command: - mysqlrouter - --bootstrap - "$${MYSQL_USER}:$${MYSQL_PASSWORD}@$${MYSQL_HOST}:$${MYSQL_PORT}" - --conf-use-sockets - --conf-base-port=6446 - --force ports: - "6446:6446" - "6447:6447" - "6450:6450" networks: - mysql-net volumes: mysqlrouter_config: mysqlrouter_state: networks: mysql-net: driver: bridge ``` #### 验证集群发现功能 ```bash # 检查集群状态 docker exec mysql-router mysqlrouter --user=mysqlrouter status # 查看发现的集群节点 docker exec mysql-router cat /var/lib/mysqlrouter/state.json | jq '.metadataCaches' # 测试读写分离 mysql -h 127.0.0.1 -P 6450 -u mgr_user -padmin -e "SELECT @@server_id" ``` #### 升级到支持多集群的版本 MySQL Router 8.0.34+ 支持多个 `metadata_cache` 段: ```bash # 使用支持多集群的版本 docker run --name mysql-router \ --network mysql-net \ -v /use01/docker/mysqlrouter:/etc/mysqlrouter \ -v /use01/docker/mysqlrouter-state:/var/lib/mysqlrouter \ mysql/mysql-router:8.0.34 \ mysqlrouter \ --bootstrap mgr_user:admin@mysql-master:3306 \ --conf-set-option=DEFAULT.name=router \ --conf-set-option=metadata_cache:cluster01.bootstrap_server_addresses=mysql-master:3306 \ --conf-set-option=metadata_cache:cluster02.bootstrap_server_addresses=another-master:3306 \ --conf-set-option=routing:cluster01_rw.bind_port=6446 \ --conf-set-option=routing:cluster01_ro.bind_port=6447 \ --conf-set-option=routing:cluster02_rw.bind_port=7446 \ --force ``` #### 清理残留配置脚本 ```bash #!/bin/bash # clean_router_config.sh CONFIG_DIR="/use01/docker/mysqlrouter" STATE_DIR="/use01/docker/mysqlrouter-state" # 停止并删除容器 docker stop mysql-router && docker rm mysql-router # 清理配置文件 rm -rf $CONFIG_DIR/* rm -rf $STATE_DIR/* # 重新创建目录 mkdir -p $CONFIG_DIR $STATE_DIR chown -R 999:999 $CONFIG_DIR $STATE_DIR echo "Router配置已清理完毕,可以重新引导" ``` #### 使用 Kubernetes ConfigMap ```yaml apiVersion: v1 kind: ConfigMap metadata: name: mysql-router-config data: mysqlrouter.conf: | [DEFAULT] name=router [metadata_cache:mycluster] bootstrap_server_addresses=mysql-master:3306 user=mgr_user metadata_cluster=mycluster ttl=5 [routing:read_write] bind_address=0.0.0.0 bind_port=6446 destinations=metadata-cache://mycluster/default?role=PRIMARY routing_strategy=first-available --- apiVersion: apps/v1 kind: Deployment metadata: name: mysql-router spec: replicas: 1 selector: matchLabels: app: mysql-router template: metadata: labels: app: mysql-router spec: containers: - name: router image: mysql/mysql-router:8.0.32 env: - name: MYSQL_PASSWORD valueFrom: secretKeyRef: name: mysql-secrets key: password volumeMounts: - name: config-volume mountPath: /etc/mysqlrouter - name: state-volume mountPath: /var/lib/mysqlrouter command: ["mysqlrouter", "-c", "/etc/mysqlrouter/mysqlrouter.conf"] volumes: - name: config-volume configMap: name: mysql-router-config - name: state-volume emptyDir: {} ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值