检索增强生成 和思维链 结合: 如何创建检索增强思维链 (RAT)?
论文地址:https://arxiv.org/pdf/2403.05313
Github地址:https://github.com/CraftJarvis/RAT
想象一下,一个人工智能助手可以像莎士比亚一样写作,像专家一样推理。这听起来很了不起,对吧?但是,如果这个助手有时难以确保事实准确性,依赖过时的信息或只是编造事实,该怎么办?
检索增强思维 (RAT)
是一种创新性的方法,它结合了两种关键技术:检索增强生成 (RAG) 和思维链 (CoT) 提示。大型语言模型 (LLM) 因其模仿人类写作和流畅回答问题的能力而变得流行。但有时,他们的回答需要以现实世界的知识为基础。RAT 通过提供一种革命性的人工智能推理方法来解决这个问题。让我们深入研究并了解 RAT 的代码!
在我们深入讨论之前,让我们先把整个提示分解一下。想象一下,你有这个超酷的人工智能助手,提示语是你用来告诉它你想要什么的目的。你可以让它为你写一个故事,翻译一种语言,或者以一种非常有信息量的方式回答一个问题,这一切都是为了给大模型一个清晰明确的提示。
最酷的部分是:提示工程让你能够激发大模型的全部潜力。你可以用它做各种各样的事情,从写出绝妙的诗歌到解决超级复杂的问题。此外,甚至还有一些高级技术,如一次性、零次、少量、思维链、指导性和迭代性提示,每种技术都适用于简单的任务和复杂的多步骤流程。
现在,我们来谈谈 RAT,这是一种结合了两种强大技术的新方法:检索增强生成 (RAG) 和思维链 (CoT)。让我们探索这两种技术如何将 大模型推理推理提升到新的高度。
检索增强生成 (RAG):知识注入器
想象一下,一个 LLM 正在研究一道数学题。RAG 就像一个乐于助人的导师。它允许 LLM 在推理过程中从外部来源(如公式或定理)获取相关信息。这确保了 LLM 的步骤以事实知识为基础,从而减少了出现奇思妙想解决方案的可能性。
思维链 (CoT):让思考变得可见
思路链提示:帮助大型语言模型展示其工作成果
大型语言模型 (LLM) 擅长生成文本,但它们在解决需要逐步推理的复杂问题(如解决文字问题)时会遇到困难。
CoT 提示通过鼓励 LLM 解释他们的想法来解决这个问题。LLM不只是给出最终答案,而是通过将问题分解为更小的步骤来展示其“工作”。这就像在数学课上展示你的计算一样。
有两种方法可以让 LLM 使用 CoT 提示:
- 零次提示:我们在提示本身中使用特殊的单词或短语,例如“让我们一步一步思考”,以促使 LLM 解释其推理。
- 少量提示:我们向 LLM 展示一些如何解决类似问题的例子,其中清楚地解释了解决步骤。
然而,CoT 提示也存在一些挑战。
- LLM 可能会犯错误:如果他们对主题没有足够的了解,他们的推理步骤可能会错误。
- LLM 可能会陷入错误的想法:有时,他们可能会提出不基于现实的解释。
思路链提示使大型语言模型能够解决复杂的算术、常识和符号推理任务。图中突出显示了思路链推理过程。
少量提示会给出一些示例来帮助语言模型理解它应该做什么,而思维链提示则会从头到尾展示逐步推理。这有助于完成需要符号推理和中间步骤的复杂任务。它最适合较大的模型,而较小的模型可能会产生奇怪的思维链并且不太精确。在某些情况下,您可以使用零次思维链提示而不显示中间步骤。
RAT:知识与思维链的结合
检索增强思维 (RAT) 是一种简单但有效的提示方法,它将思路链 (CoT) 提示与检索增强生成 (RAG) 相结合,以处理长窗口推理和生成问题。
因此,LLM 生成零样本思维链 (CoT),并与 RAG 合并。使用这些想法作为询问,对其进行因果修正并逐步发展出答案。
使用信息检索迭代修改思维链可显著增强大型语言模型在处理长视域生成任务时的推理和生成能力。这种方法还大大减少了幻觉的发生。我们提出的方法称为检索增强思维 (RAT),它涉及使用从相关来源检索到的信息逐一修改每个思维步骤。这包括任务查询,以及生成初始零样本 CoT 后的当前和过去思维步骤。
通过将 RAT 应用于各种基础模型,我们发现它们在各种长视界生成任务上的表现都有显著提升。平均而言,代码生成评分相对提高 13.63%,数学推理评分提高 16.96%,创意写作评分提高 19.2%,具体任务规划评分提高 42.78%。
检索增强思维 (RAT) 的管道。给定一个任务提示(在图中表示为 I),RAT 从 LLM 在零样本(“让我们一步一步思考”)中产生的初始分步思维(𝑇1、𝑇2、· · ·、𝑇𝑛)开始。由于幻觉,某些思维步骤(例如图中的 𝑇1)可能存在缺陷。RAT 使用来自外部知识库(表示为 Library)的 RAG 迭代地修改每个思维步骤。
该图概述了检索增强思维 (RAT) 流程,这是一种促使大型语言模型 (LLM) 提高其在长窗口任务中的推理能力的方法。以下是关键模块的原理:
步骤 0:初稿
- 向 LLM 提出任务提示。
- 该示例展示了有关在 Minecraft 中获取钻石的提示。
步骤 1-步骤 n:迭代细化
- LLM 根据对提示的理解生成初始响应(Zero CoT)。由于缺乏具体信息,这可能会存在缺陷。
- RAT 结合了 CoT 提示,其中 LLM 通过解释每个步骤的理由 (Ti) 来反复修改其响应。
关键组件
- 任务提示:这是起点,为 LLM 提供要解决的问题。
- LLM:这代表大型语言模型本身。
- 初始 CoT(
Ti-1、Ti
):这些是 LLM 在迭代过程中的初始和修订的思维链。 - 知识库:这象征着 LLM 可以通过检索增强生成 (RAG) 访问的外部知识库。
- 增强修订:这指的是 LLM 如何根据检索到的信息和先前的解释来完善其思维链 (
Ti
)。
RAT 流程
- 初始响应: LLM 根据提示 (T0) 生成初始响应。
- 解释: LLM 解释了初步回应 (T1-1) 背后的原因。
- 检索: RAT 根据解释从外部知识库(Library)检索相关信息。
- 修订: LLM 通过整合检索到的信息来修订其思维链 (T1)。
- 重复:重复步骤 2-4,直到 LLM 得到满意的解决方案 (Tn)。
下图强调了 RAT 如何通过结合外部知识检索和逐步解释来解决 LLM 在复杂推理任务中的局限性。
图 | 上:不同 LLM 推理方法在创意生成任务上的示例。红色文本表示 LLM 生成的文本中的错误或错觉,而绿色文本表示正确生成。没有 RAG 的方法通常会产生带有幻觉的不正确信息,经典 RAG 与结构松散的检索内容高度相关,而 RAT 生成的文本在准确性和完整性方面表现最佳。下:不同 LLM 推理方法在复杂的具身规划、数学推理、代码生成和创意生成任务上的定量性能比较。我们的 RAT 在所有任务上的表现都优于所有基线。
RAT核心代码
https://github.com/CraftJarvis/RAT/blob/main/app/gradio_app.py
RAT实现如下:
def rat(question):print(f"{datetime.now()} [INFO] Generating draft...")draft = get_draft(question)print(f"{datetime.now()} [INFO] Return draft.")# print(f"##################### DRAFT #######################")# print(draft)# print(f"##################### END #######################")print(f"{datetime.now()} [INFO] Processing draft ...")# draft_paragraphs = split_draft(draft)draft_paragraphs = split_draft_openai(question, draft)print(f"{datetime.now()} [INFO] Draft is splitted into {len(draft_paragraphs)} sections.")answer = ""for i, p in enumerate(draft_paragraphs):# print(str(i)*80)print(f"{datetime.now()} [INFO] Revising {i+1}/{len(draft_paragraphs)} sections ...")answer = answer + '\n\n' + p# print(f"[{i}/{len(draft_paragraphs)}] Original Answer:\n{answer.replace(newline_char, ' ')}")# query = get_query(question, answer)print(f"{datetime.now()} [INFO] Generating query ...")res = run_with_timeout(get_query_wrapper, 30, question, answer)if not res:print(f"{datetime.now()} [INFO] Generating query timeout, skipping...")continueelse:query = resprint(f">>> {i}/{len(draft_paragraphs)} Query: {query.replace(newline_char, ' ')}")print(f"{datetime.now()} [INFO] Crawling network pages ...")# content = get_content(query)res = run_with_timeout(get_content_wrapper, 30, query)if not res:print(f"{datetime.now()} [INFO] Parsing network pages timeout, skipping ...")continueelse:content = resLIMIT = 2for j, c in enumerate(content):if j >= LIMIT: # limit rge number of network pagesbreakprint(f"{datetime.now()} [INFO] Revising answers with retrieved network pages...[{j}/{min(len(content),LIMIT)}]")# answer = get_revise_answer(question, answer, c)res = run_with_timeout(get_revise_answer_wrapper, 30, question, answer, c)if not res:print(f"{datetime.now()} [INFO] Revising answers timeout, skipping ...")continueelse:diff_html = generate_diff_html(answer, res)display(HTML(diff_html))answer = resprint(f"{datetime.now()} [INFO] Answer revised [{j}/{min(len(content),3)}]")# print(f"[{i}/{len(draft_paragraphs)}] REVISED ANSWER:\n {answer.replace(newline_char, ' ')}")# print()res = run_with_timeout(get_reflect_answer_wrapper, 30, question, answer)if not res:print(f"{datetime.now()} [INFO] Reflecting answers timeout, skipping next steps...")else:answer = resreturn draft, answer
-
生成初始草稿:
- 使用 GPT-3.5-turbo 生成一个初始的草稿答案(
draft
)。 - 草稿答案是基于用户输入的问题生成的,可能包含一些错误或不完整的信息。
- 使用 GPT-3.5-turbo 生成一个初始的草稿答案(
-
分割草稿:
- 将草稿答案分割成多个段落(
draft_paragraphs
),每个段落包含一个完整的思路。 - 分割的目的是为了逐段修正和优化答案。
- 将草稿答案分割成多个段落(
-
逐段修正答案:
- 对每个段落,生成一个检索查询(
query
),用于从网络中检索相关信息。 - 根据检索到的内容,修正当前段落的答案。
- 重复这一过程,直到所有段落都修正完毕。
- 对每个段落,生成一个检索查询(
-
结构化输出:
- 最后,为修正后的答案添加标题和副标题,使其更具结构性。
-
返回结果:
- 返回初始草稿和修正后的最终答案。
示例流程
假设用户输入的问题是:“介绍爱因斯坦的生平和成就。”
-
生成初始草稿:
- GPT-3.5-turbo 生成一个初始答案,可能包含一些不准确的信息。
-
分割草稿:
- 将初始答案分割成多个段落,例如:
- 段落1:爱因斯坦的早期生活。
- 段落2:爱因斯坦的科学成就。
- 段落3:爱因斯坦的晚年生活。
- 将初始答案分割成多个段落,例如:
-
逐段修正:
- 对每个段落生成检索查询,例如:
- 查询1:“爱因斯坦的早期生活”。
- 查询2:“爱因斯坦的科学成就”。
- 查询3:“爱因斯坦的晚年生活”。
- 根据检索结果修正每个段落的内容。
- 对每个段落生成检索查询,例如:
-
结构化输出:
- 为修正后的答案添加标题和副标题,例如:
- 标题:爱因斯坦的生平和成就
- 副标题1:早期生活
- 副标题2:科学成就
- 副标题3:晚年生活
- 为修正后的答案添加标题和副标题,例如:
-
返回结果:
- 返回初始草稿和修正后的最终答案。
其中用到的一些提示语如下:
prompt1 = """
尝试用逐步的思考来回答这个问题\指令,并使答案更具结构化。
使用 `\n\n` 来将答案分成几个段落。
直接响应指令。除非被要求,否则不要在答案中添加额外的解释或介绍。
"""prompt2 = """
我想验证给定问题的内容准确性,特别是最后几句话。
请用相应的问题总结内容。
这个总结将被用作必应搜索引擎的查询。
查询应该简短,但需要足够具体,以确保必应能够找到相关知识或页面。
您还可以使用搜索语法,使查询足够简短和清晰,以便搜索引擎能够找到相关的语言数据。
尽量使查询与内容中的最后几句话尽可能相关。
**重要**
直接输出查询。除非被要求,否则不要在答案中添加额外的解释或介绍。
"""prompt3 = """
我想根据在维基百科页面上学到的相关文本来修订答案。
你需要检查答案是否正确。
如果你在答案中发现了错误,请修订答案使其更好。
如果你发现有些必要的细节被忽略了,请根据相关文本添加这些细节,以使答案更加可信。
如果你发现答案是正确的且不需要添加更多细节,请直接输出原始答案。
**重要**
尽量保持修订后答案的结构(多个段落及其子标题),使其更具结构性以便理解。
用 `\n\n` 字符分隔段落。
直接输出修订后的答案。除非被要求,否则在修订后的答案中不要添加额外的解释或声明。
"""
RAT 的优势
- 提高准确性:通过允许 LLM 访问外部知识并改进其推理,RAT 有助于减少错误并生成更准确的解决方案。
- 增强的可解释性:带有解释的迭代过程可以深入了解 LLM 的思维过程,从而更容易识别和解决任何问题。
- 更强的长窗口推理能力: RAT 对于需要多步骤的复杂任务特别有益,因为推理透明度至关重要。
参考资料
- How Retrieval-Augmented Generation (RAG) and Chain-of-Thought (CoT) Create Retrieval-Augmented-Thought(RAT)?
- 检索增强思考 RAT(RAG+COT):提升 AI 推理能力的强大组合 原创
- 【LLM-RAG】RAT:检索增强思维提示实现上下文感知推理
- 将RAG与CoT结合起来的技术,RAT减轻长文本生成出现的幻觉问题
- 【AI大模型应用开发】RAT原理与实现:又是一个提高大模型生成能力的方法(附完整代码)
相关文章:

检索增强生成 和思维链 结合: 如何创建检索增强思维链 (RAT)?
论文地址:https://arxiv.org/pdf/2403.05313 Github地址:https://github.com/CraftJarvis/RAT 想象一下,一个人工智能助手可以像莎士比亚一样写作,像专家一样推理。这听起来很了不起,对吧?但是࿰…...

在 SQL 中,区分 聚合列 和 非聚合列(nonaggregated column)
文章目录 1. 什么是聚合列?2. 什么是非聚合列?3. 在 GROUP BY 查询中的非聚合列问题示例解决方案 4. 为什么 only_full_group_by 要求非聚合列出现在 GROUP BY 中?5. 如何判断一个列是聚合列还是非聚合列?6. 总结 在 SQL 中&#…...

单元测试3.0+ @RunWith(JMockit.class)+mock+injectable+Expectations
Jmockit使用笔记_基本功能使用Tested_Injectable_Mocked_Expectations_jmockit.class-CSDN博客 静态变量直接赋值就好,没必要mock了 测试框架Jmockit集合junit使用 RunWith(JMockit.class) 写在测试案例类上的注解 Tested 在测试案例中,写在我们要测试的类上…...

STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)
一:步进电机简介 步进电机又称为脉冲电机,简而言之,就是一步一步前进的电机。基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩,步进电机的角位移量与输入的脉冲个数严格成正…...

MotionCtrl: A Unified and Flexible Motion Controller for Video Generation 论文解读
目录 一、概述 二、相关工作 三、前置知识 1、LVDM Introduction 2、LVDM Method 3、LVDM for Short Video Generation 4、Hierarchical LVDM for Long Video Generation 5、训练细节 6、推理过程 四、MotionCtrl 1、CMCM 2、OMCM 3、训练策略 五、实验 一、概述…...

LINUX线程操作
文章目录 线程的定义LINUX中的线程模型一对一模型多对一模型多对多模型 线程实现原理线程的状态新建状态(New)就绪状态(Runnable)运行状态(Running)阻塞状态(Blocked)死亡状态&#…...

在Lua中,Metatable元表如何操作?
Lua中的Metatable(元表)是一个强大的特性,它允许我们改变表(table)的行为。下面是对Lua中的Metatable元表的详细介绍,包括语法规则和示例。 1.Metatable介绍 Metatable是一个普通的Lua表,它用于…...

4D LUT: Learnable Context-Aware 4D LookupTable for Image Enhancement
摘要:图像增强旨在通过修饰色彩和色调来提高照片的审美视觉质量,是专业数码摄影的必备技术。 近年来,基于深度学习的图像增强算法取得了可喜的性能并越来越受欢迎。 然而,典型的努力尝试为所有像素的颜色转换构建统一的增强器。 它…...

瑞芯微rk3568平台 openwrt系统适配ffmpeg硬件解码(rkmpp)
瑞芯微rk3568平台 openwrt系统适配ffmpeg硬件解码(rkmpp) RK3568及rkmpp介绍编译安装mpp获取源码交叉编译安装 libdrmlibdrm-2.4.89 make 方式编译(cannot find -lcairo, 不推荐)下载源码编译编译错误: multiple definition of `nouveau debug‘错误cannot find -lcairo:…...

使用SuperMap制作地形图的详细教程
一、数据准备 本示例以山东为例,演示如何通过SuperMap iDesktopX制作一个好看的地形图。所有数据均来源于互联网公开数据,如有自己项目真实数据,可直接跳过数据下载进入下一步。 本示例所需数据包括: 数据类别 数据类型 DEM数据…...

PHP Array:精通数组操作
PHP Array:精通数组操作 PHP,作为一门流行的服务器端编程语言,提供了强大的数组处理能力。数组是PHP中非常灵活和强大的数据结构,它可以存储多个相同类型的值。在PHP中,数组不仅可以存储数字,还可以存储字…...

【使用命令配置java环境变量永久生效与脚本切换jdk版本】
java配置环境变量命令与脚本切换jdk版本 新建用户环境变量永久生效 setx JAVA8_HOME "D:\Java\jdk8" setx JAVA17_HOME "d:\Java\jdk-17" setx JAVA_HOME %JAVA8_HOME% setx CLASSPATH ".;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;"…...

STM32-笔记32-ESP8266作为服务端
esp8266作为服务器的时候,这时候网络助手以客户端的模式连接到esp8266,其中IP地址写的是esp8266作为服务器时的IP地址,可以使用ATCIFSR查询esp8266的ip地址,端口号默认写333。 当esp8266作为服务器的时候,需要完成哪些…...

RAG(Retrieval-Augmented Generation,检索增强生成)流程
目录 一、知识文档的准备二、OCR转换三、分词处理四、创建向量数据库五、初始化语言聊天模型1.prompt2.检索链3.对话 完整代码 知识文档的准备:首先需要准备知识文档,这些文档可以是多种格式,如Word、TXT、PDF等。使用文档加载器或多模态模型…...

【Python学习(六)——While、for、循环控制、指数爆炸】
Python学习(六)——While、for、循环控制、指数爆炸 本文介绍了While、for、循环控制、指数爆炸,仅作为本人学习时记录,感兴趣的初学者可以一起看看,欢迎评论区讨论,一起加油鸭~~~ 心中默念:Py…...

解释一下:运放的输入失调电流
输入失调电流 首先看基础部分:这就是同相比例放大器 按照理论计算,输入VIN=0时,输出VOUT应为0,对吧 仿真与理论差距较大,有200多毫伏的偏差,这就是输入偏置电流IBIAS引起的,接着看它的定义 同向和反向输入电流的平均值,也就是Ib1、Ib2求平均,即(Ib1+Ib2)/2 按照下面…...

力扣hot100——二分查找
35. 搜索插入位置 class Solution { public:int searchInsert(vector<int>& a, int x) {if (a[0] > x) return 0;int l 0, r a.size() - 1;while (l < r) {int mid (l r 1) / 2;if (a[mid] < x) l mid;else r mid - 1;}if (a[l] x) return l;else …...

PHP 使用集合 处理复杂数据 提升开发效率
在 PHP 中,集合(Collections)通常是通过数组或专门的集合类来实现的。 集合(Collection)是一种高级的数据结构,可以提供比普通数组更强大的操作和功能,特别是当你需要更复杂的数据处理时。 La…...

Unity 对Sprite或者UI使用模板测试扣洞
新建两个材质球: 选择如下材质 设置如下参数: 扣洞图片或者扣洞UI的材质球 Sprite或者UI的材质球 新建一个单独Hole的canvas,将SortOrder设置为0,并将原UI的canvans的SortOrder设置为1 对2DSprite则需要调整下方的参数 hole的O…...

unity学习3:如何从github下载开源的unity项目
目录 1 网上别人提供的一些github的unity项目 2 如何下载github上的开源项目呢? 2.1.0 下载工具 2.1.1 下载方法1 2.1.2 下载方法2(适合内部项目) 2.1.3 第1个项目 和第4项目 的比较 第1个项目 第2个项目 第3个项目 2.1.4 下载方法…...

PHP后执行php.exe -v命令报错并给出解决方案
文章目录 一、执行php.exe -v命令报错解决方案 一、执行php.exe -v命令报错 -PHP Warning: ‘C:\windows\SYSTEM32\VCRUNTIME140.dll’ 14.38 is not compatible with this PHP build linked with 14.41 in Unknown on line 0 解决方案 当使用PHP8.4.1时遇到VCRUNTIME140.dll…...

CDP集群安全指南-动态数据加密
[〇]关于本文 集群的动态数据加密主要指的是加密通过网络协议传输的数据,防止数据在传输的过程中被窃取。由于大数据涉及的主机及服务众多。你需要更具集群的实际环境来评估需要为哪些环节实施动态加密。 这里介绍一种通过Cloudera Manager 的Auto-TLS功能来为整个…...

【shell编程】报错信息:Undefined Variable(包含6种解决方法)
大家好,我是摇光~ 当Shell脚本报错“Undefined Variable”时,是未定义变量的意思。 以下是对每个可能原因及其对应详细解决方案的详细解释: 原因1:拼写错误 原因: 脚本中变量名的拼写在使用和定义时不一致。例如&…...

Dubbo扩展点加载机制
加载机制中已经存在的一些关键注解,如SPI、©Adaptive> ©Activateo然后介绍整个加载机制中最核心的ExtensionLoader的工作流程及实现原理。最后介绍扩展中使用的类动态编译的实 现原理。 Java SPI Java 5 中的服务提供商https://docs.oracle.com/jav…...

unity学习7:unity的3D项目的基本操作: 坐标系
目录 学习参考 1 unity的坐标系 1.1 左手坐标系 1.2 左手坐标系和右手坐标系的区别 1.3 坐标系的原点(0,0,0) 2 坐标系下的具体xyz坐标 2.1 position这里的具体xyz坐标值 2.2 父坐标 2.3 世界坐标和相对坐标 2.3.1 世界坐标 2.3.2 相对坐标 2.4 父物体,…...

PyTorch框架——基于深度学习EfficientDeRain神经网络AI去雨滴图像增强系统
第一步:EfficientDeRain介绍 EfficientDeRain 是一个针对单张图像去雨的开源项目,该项目由清华大学的研究团队提出,主要用于处理图像中的雨水干扰,恢复图像的真实场景 核心功能 图像去雨:EfficientDeRain 通过学习像素…...

写一个类模板三个模板参数K,V,M,参数是函数(函数参数、lambda传参、函数指针)
cal是类的成员函数。cal的3个入参是func1(K),func2(K,V),func3(K,V,M),请写出cal,并在main函数中调用cal 在您给出的要求中,cal成员函数并不直接…...

国内Ubuntu环境Docker部署Stable Diffusion入坑记录
国内Ubuntu环境Docker部署Stable Diffusion入坑记录 本文旨在记录使用dockerpython进行部署 stable-diffusion-webui 项目时遇到的一些问题,以及解决方案,原项目地址: https://github.com/AUTOMATIC1111/stable-diffusion-webui 问题一览: …...

现代光学基础6
总结自老师的ppt yt6 半导体激光器开卷考试学习资料 目录 半导体激光器边发射半导体激光器垂直腔面发射激光器(VCSEL)激光产生条件(激光原理)半导体激光器的水容器模型有源半导体区域类型和载流子注入发光二极管(L…...

解决HBuilderX报错:未安装内置终端插件,是否下载?或使用外部命令行打开。
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 错误描述 在HBuilderX中执行npm run build总是提醒下载插件;图示如下: 但是,下载总是失败。运行项目时候依然弹出上述提醒。 解决方案 …...