Blog

TSS与LDT选择子的计算

Content #

#define FIRST_TSS_ENTRY 4
#define FIRST_LDT_ENTRY (FIRST_TSS_ENTRY+1)
#define _TSS(n) ((((unsigned long) n)<<4)+(FIRST_TSS_ENTRY<<3))
#define _LDT(n) ((((unsigned long) n)<<4)+(FIRST_LDT_ENTRY<<3))
#define ltr(n) __asm__("ltr %%ax"::"a" (_TSS(n)))
#define lldt(n) __asm__("lldt %%ax"::"a" (_LDT(n)))

进程0中GDT、LDT、TSS关系示意图

ltr(n)可将任务号为n的进程的TSS选择符加载到TR寄存中。 _TSS宏用于计算n号任务的TSS选择子,计算公式为:

(n * 2 + 4) << 3

进程0的TSS在GDT中的序号是4,每个进程占用GDT中两个条目。

From #

Linux内核设计的艺术

段选择子(Segment Selectors)

book:福格行为模型

Content #

《福格行为模型》 B.J.福格 6个笔记

中文版序

◆ 只有在感觉良好而不是感觉糟糕时,你才能达到最好的改变效果。

3要素齐备,行为才能发生

◆ 令人愉快的行为和有挑战性的行为给人的感受截然不同,有时候就像是独轮车和自行车的区别。人们一开始根本无法看出两类行为之间有什么关联,但对于想要改变行为的人来说,这个概念至关重要。

“珍珠习惯”,管理压力与焦虑

◆ 成效最佳的改变,源自感觉良好,而非感觉糟糕。

◆ 为用户设计“定制化”提示

05 创造积极情绪,将行为固化为习惯

◆ 只需要微笑并在脑海中说“耶”,就能营造出一种成功的感觉。

行为设计,本质就是情绪设计

◆ 益智休闲游戏《糖果传奇》(Candy Crush)的下载量超过20亿次。它是一款简单且免费的消除游戏,在移动设备上也可以玩。第一关容易至极。为了强化你获得成功的喜悦感,设计师构建出了各种各样有趣的感官体验,有令人愉悦的叮当声和视觉设计。在玩家达成一定分数值后,页面甚至会直接弹出“Sweet”这个单词。结果,你真的很快就能感受到成功的喜悦,接下来,只要有两三分钟空闲你可能就会打开糖果传奇玩几关,因为游戏带来的体验是“甜美”的、很棒的。

– 来自微信读书

From #

ReWOO(Reason WithOut Observation)

Content #

论文《ReWOO: Decoupling Reasoning from Observations for Efficient Augmented Language Models》提出了 ReWOO 思想,即如果大模型能一次性的把所有步骤都告诉人类,人类把每个步骤对应的工具调用结果一次性返回给大模型,不就可以只提问一次就解决问题了吗?

ReWOO 用了两个大模型,其中一个叫 Planner,另一个叫 Solver。当人类提出问题时,Planner 会直接规划出问题的解决步骤,以及每一步需要调什么工具,形成一个模板,返回给人类。例如:

我需要调用 A 工具,工具调用结果为:
我需要调用 B 工具,工具调用结果为:
我需要调用 C 工具,工具调用结果为:

人类可根据模板,调用工具后,填充,然后发送给 Solver 大模型,由 Solver 大模型给出最终答案。

这样就避免了,每解决一个小问题,都要带上历史对话反馈一次,极大地节省了 token。

Viewpoints #

From #

03|Agent的常见推理模式:CoT、ReAct、Reflexion究竟是什么?-AI 重塑云原生应用开发实战-极客时间

ReAct(Reason+Act)

Content #

ReAct 一词来自于论文《ReAct: Synergizing Reasoning and Acting in Language Models》,包含 Reason 与 Act 两个部分,其中 Reason 就是大模型推理的过程,其推理运用了 CoT 的思想;Act 是与外界环境交互的动作。

ReAct 发明的初衷是为了解决两个问题,第一,大模型执行的结果不可观测,导致出现“幻觉”;第二,大模型不能与外部环境交互,导致无法回答一些特定垂直领域或者实时问题。

我们先来结合一张图,了解一下 ReAct 的过程。

在最开始,我们输入给大模型一个任务,例如,任务为“请问济南的天气如何?”,同时将天气的 API 工具也输入给大模型。此时大模型会进行推理,得出的结论是需要调用天气预报工具来解决问题。

结合第一节课 Function Calling 相关的知识,我们知道,大模型只能选择工具,工具的执行者是人类。于是人类便开始行动,替大模型执行天气工具,并将得到的结果反馈给大模型。

此时重点来了,大模型会观察人类返回的结果,看看结果是否能满足要求。这里的观察主要是观察工具调用的结果对不对,是否有错误。当然这里指的有错误,是工具调用错误,而不是数据错误,例如工具反馈给大模型,济南的温度是 80℃,大模型是不会认为有问题的。但如果反馈给大模型的是“400 bad request”,则大模型就会认为工具调用出问题了,它会重新推理后,再次尝试调用工具。

如果大模型观察后,认为没问题,则会继续推理,思考是继续调用其他工具解决问题呢,还是答案已经能解决用户提问了呢?如果是前者,则就会继续进入选择工具、调用工具、反馈、观察的步骤;如果是后者,则大模型会直接输出答案。

我用一个连续对话为你整理一下以上过程,方便理解。

user: 济南的天气如何?+ 天气查询 API 工具(get_weather)
assistant: 经过思考,我需要调用get_weather工具


人类调用get_weather工具...


user: Observasion: 400 bad request
assistant: 看起来调用 get_weather 工具出错了,我们尝试再调用一次,我需要调用get_weather工具


人类调用get_weather工具...


user: Observasion: 济南晴,温度80℃
assistant: 我已经得到了最终答案,济南是晴天,温度80℃。

相信看到这里,你已经懂得了 ReAct 的原理了。其实思想非常简单,就是在 CoT 推理方案的基础上,加上工具调用,以及工具结果观察,这样做可以极大地减少幻觉的产生。由于该方案思路简单,效果霸道,在 Agent 应用开发中,使用率非常高。

...

Reflexion

Content #

Reflexion 相比 Reflection,将反思这一步细化后,分成了如下图所示的 Evaluator(评估)和 self-reflection(自我反思)两个部分。图中剩余的另一个大模型 Actor,即为 Reflection 中的 Generator。图中还包含了 Trajectory(轨迹)以及 Experience(经验)两种记忆。

我们来串一下 Relecxion 的流程。

  1. 从 Actor 开始,还是根据用户提问,生成答案,但这次,Actor 继承了 ReAct 的能力,可以与外界环境交互,并观察答案,然后通过 Trajector 模块将对话记录存储在短期记忆,比如内存中。

  2. 之后,Evaluator 和 Self-reflection 模块开始介入,Evaluator 对对话结果做评估,检查答案是否正确。Self-reflection 则汇总评估结果,以及对话内容做总结反思,总结出经验教训后,存储到长期记忆中,比如 Redis 等等数据库。

  3. 等到下次再提类似问题时,可以将经验与问题同时输入给 Actor,这样有了经验做加持,Actor 就会少走弯路。

回到英国伦敦天气的例子,我们套用一下这个思路。假设第一次提问时,Actor 调用了高德地图天气 API,提示无权限,随后又调用墨迹天气 API,返回了伦敦天气阴,19 摄氏度。Evaluator 会验证 19 摄氏度是否准确,避免出现 80 摄氏度的情况。Self-reflection 会总结出:要想查询国外天气,需要调用墨迹天气 API。这样当下次提问美国纽约天气时,Actor 就会直接调用墨迹天气 API。

Viewpoints #

From #

03|Agent的常见推理模式:CoT、ReAct、Reflexion究竟是什么?-AI 重塑云原生应用开发实战-极客时间

Content #

ReAct 一词来自于论文《ReAct: Synergizing Reasoning and Acting in Language Models》,包含 Reason 与 Act 两个部分,其中 Reason 就是大模型推理的过程,其推理运用了 CoT 的思想;Act 是与外界环境交互的动作。

...

Agent的思考过程

Content #

在论文《The Rise and Potential of Large Language Model Based Agents: A Survey》中,有一幅非常经典的图片为我们展示了 Agent 在处理问题时的思考过程。

可以看到,图片中将 Agent 拆分成了感知(Perception)、大脑(Brain)以及行动(Action)三部分。

感知(Perception) #

正如人类具备五感一样,大模型也可以通过各类传感器获取输入信息,这被称作多模态输入。多模态输入主要包括:

  1. 文本输入:例如人类用文字与 ChatGPT 聊天或者上传一个文件让 ChatGPT 分析内容等等。
  2. 视觉输入:例如人类可以上传一张蒙娜丽莎的图片到 ChatGPT4,让其说明图片上是什么。
  3. 语音输入:人类可以通过语音与大模型进行交流。
  4. 其他输入:在物联网时代,人类利用各类传感器实现物物相连。如今,也可以通过传感器为大模型配置上各种感官能力,例如温湿度、传感器等等。

大脑(Brain) #

在日常生活中,有时会遇到这样的情况:明明已经向某人详细交代了某项任务,但他却当作耳边风一样,很快就忘记了。这种现象,我们形象地称之为“左耳进,右耳出”。这似乎暗示着,信息在从耳朵进入大脑的过程中,并没有得到应有的重视和处理,就像是一条没有被大脑这座桥梁连接的河流,直接从一边流入,又从另一边流出了。

同样,对于大模型,如果只有信息输入,而不去做信息的加工,那么输入的信息将毫无意义。

在图中,大脑所完成的工作大致分成三个部分。

  1. 自然语言的处理

a. 多轮对话处理能力

大模型能够结合对话上下文,理解人类对话的意图,最终完成对话目标。当上下文对话过长时,会有很多处理手法,例如图中所显示的 Summary,即摘要,可以对上文对话做总结,从而节省 token。

b. 语义理解与高质量文本生成

不同的人以及不同的语种提问的方式都不相同,大模型能够理解人类的提问,并给出相应的文本生成。

  1. 存储

图中给出了 Memory(记忆)和 Knowledge(知识)两种存储。

记忆有助于大模型更好地理解人类意图,从而更好地处理问题,例如如下场景:

history:
human: 北京的天气如何?
AI: 北京晴,13~20℃

question:
human: 济南呢?

如果没有记忆,大模型在处理“济南呢?”这个问题时,就无法参考 history 的历史对话,从而无法理解这个问题是想要问什么。如果有记忆,则可以理解问题问的是“济南的天气如何?”。

记忆可以分为长期记忆和短期记忆。长期记忆即可以将对话历史存储到 Redis 等数据库中。短期记忆就是在内存中存储的上下文对话。

当记忆过长时,为了节省 token 以及更好的让大模型参考,可以使用上文提到的摘要的方法,对记忆进行总结。

...

cgroup控制容器资源

Content #

docker run -d --cpu-shares 513 --cpus 2 --cpuset-cpus 1,3 --memory 1024M --memory-swap 1234M --memory-swappiness 7 -p 8081:80 testnginx:1
# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                  NAMES
3dc0601189dd        testnginx:1         "/bin/sh -c 'nginx -…"   About a minute ago   Up About a minute   0.0.0.0:8081->80/tcp   boring_cohen

cgroup 对于 Docker 资源的控制

Viewpoints #

From #

58 | cgroup技术:内部创业公司应该独立核算成本-趣谈 Linux 操作系统-极客时间

卡方检验(Chi-square test)

Content #

一种常用的非参数统计方法,主要用于分析分类变量(categorical variables)之间的关联性或拟合优度。它通过比较观察频数与期望频数的差异,判断数据是否符合某种理论分布或变量之间是否独立。

​核心思想 #

卡方检验基于以下假设:

​原假设(H₀)​:观察数据与理论分布无显著差异,或变量间相互独立。​备择假设(H₁)​:观察数据与理论分布存在显著差异,或变量间存在关联。通过计算卡方统计量​(Chi-square statistic, χ²),判断实际观测值与理论期望值的偏离程度是否由随机误差导致。

卡方拟合优度检验(Goodness-of-Fit Test)​ #

​用途:检验单个分类变量是否符合某个理论分布(如均匀分布、正态分布等)。​示例:检验骰子是否公平(各点数出现概率是否均为1/6)。

​卡方独立性检验(Test of Independence)​ #

​用途:检验两个分类变量是否独立(无关联)。​示例:分析性别(男/女)与吸烟习惯(吸烟/不吸烟)是否相关。

​卡方同质性检验(Test of Homogeneity)​ #

​用途:检验不同组别在某一分类变量上的分布是否相同。​示例:比较不同地区人群的血型分布是否一致。

From #