Aneaice 发布的文章

火爆到出圈的openclaw🦞

openclaw是一个开源的github项目,是一个通过有机结合agent+LLM+memory等组件构成的“ai职能助手”,目前已经从国外火爆到了国内,从传统的IT技术领域火爆到了各行各业。

我体验过,然后特别不理解现在互联网上出现的“拜”龙虾的奇怪现象,人们带上毛绒龙虾爪,头上带着深红色龙虾帽子,用“养虾”来形容他们使用openclaw的行为。
互联网上,大部分的人,都争先恐后、费尽心思的企图和龙虾挨上边,不论是评价视频、技术视频、体验视频,还是openclaw相关消费。

我不太确定是因为我节奏太慢跟不上时代了,还是现在出现了什么我不知道的大变化,我最近两周时间内都在忙活和编写一个AWS环境下基于AMI的同地区异账号迁移脚本,然后这几天因为缺少项目经验,卡在了异步确认AWS回传状态这个问题上。

早在26年的1月左右,我就已经知道了这个龙虾的存在,并且抱着尝鲜的心态去研究了一下,当时我还单纯的认为或许可以梳理我之前写的大堆杂乱的笔记。

第一天。
我遇上了国产LLM和海外LLM之间的问题,通过研究官方文档自定义了一部分配置代码,解决了openclaw接入国产DeepSeek的问题。
优化了openclaw的上下文,参考官方文档编写了一些组成openclaw记忆的markdown文件……
最终openclaw以一个不错的状态,在我的树莓派5上正常跑起来了。

第三天。
我发觉通过openclaw进行的任务完成度普遍较低,且通常都会消耗非常庞大的Token资源,一次用户层面的问答,少至10W Token,多至100W Token的消耗。
我研究了日志和一部分源码实现,发现在我的设备上openclaw预期的记忆memory模块并没有发挥作用。
而在openclaw的理想使用环境下,记忆模块memory也是通过API对接到LLM提供商,来处理和优化的问题。
在我的环境下,我是用的DeepSeek并没有类似的服务提供。所以为了实现上下文连贯和超长对话,openclaw会把我所有的对话详细、我的笔记等,“打包”发给DeepSeek,这些对话详情充斥着大量的不相关的无效信息。

第四天。
为了解决我遇到的问题和节约Token开销,我开始研究memory模块相关的官方文档,并从中得到了其他两种方法,效果是能够更精准的识别对话中的语言意思。
这两种方法分别是QMD和本地增强语义检索。

第四天到第十天。
我花费了差不多一周的实践测试和验证部署,测试结果都不理想,最终根据日志和源码定位到兼容性的问题上。
QMD项目是基于苹果Mac和一张A100显卡环境下诞生,只提供了几个主流的预编二进制,他对于硬件的适配性简直是糟糕,在我的树莓派5上因为缺少对应的硬件环境而无法使用。
后来,我解决QMD项目中出现的依赖问题,手动的调整了依赖关系,成功在本地编译针对树莓派5优化的底层依赖,但最终还是倒在了QMD中语义重排功能上,这个能力是依赖于开发者自己倒腾的一个基于Qwan的私有模型和CUDA已经死绑在了一起。
本地向量化语义也是相同的结果,都对上游的生态软件严重依赖。
这也有一部分是因为我缺乏边缘化硬件经验的因素影响,总的来说体验糟糕。

第二周。
我放弃了再向经常出现幻觉和上下文窗口故障的openclaw投入时间和金钱,清理了环境。

openclaw,这玩意不太好使,或者是我没有在理想环境下使用它。

AI的“幻觉”

AI的幻觉主要表现为在进行比较长的对话中,他会经常性的遗忘,导致任务出现或多或少的偏差,这也是AI编数据的说法来源。
但是我认为,除了技术缘故的AI幻觉外,还有人对AI的幻觉。
我之前也曾幻想自己在得到了AI之后,能够非常巨大的改变当下的生活,加速并超越别人。

但结果很明显,我写下了我的疑惑、我的思考、我现在答案。

一台运行在计算机上的AI智能体,到底能否实质性的帮助到人,在生活上发挥积极的作用?

在包括我和观察到的3~4个深度体验者的范围内,没有人真的能够实现网络上传言的那样——“一人及公司,靠着龙虾创办公司”,“在使用龙虾后,我的效率提升了xxx倍。”
没有能够通过openclaw获得巨大的提升,或者是完成原本自己无法很好处理和解决的疑难杂症。

前文提到,我希望AI能够帮我梳理或整理杂乱的笔记库,让我之后能够通过查询找到相关联笔记,并且进行重构和整理。
但当深度体验了openclaw之后,我时常觉得不是我在使用ai,而是AI在训练我,感觉相当的糟糕。
我时常需要纠正,忍受着燃烧Token的代价,并且将自己的实践和精力投入到一场人和机器上的交锋,我需要减少幻觉,而AI需要完成他的任务。
但往往一个简单任务,都会伴随相当多复杂情况问题,例如我遇到的硬件兼容性挑战上。
AI只是简单的吧答案抄下来,然后通过对话丢给我,其本身思考就是一次性,且不需要考虑任何责任。
我企图节省的时间,被消耗在了纠错、校对这些步骤上,而我根本没有获得什么太多的成长,只是在进行简单的逻辑判断。
AI的输出给的唯一有效解和我是实际体验,完全是相互辩驳的,这种割裂的状态也令人难以忍受。
我感觉我的时间被偷走了。
当我回忆两周的体验,最深刻的还是因为硬件的兼容性问题和我尝试手动优化代码本地编译依赖,这两个实实在在困扰我的问题。
我用AI做了什么,AI给我了什么答案?不去看对话记录,我难以回忆。

而另一位城市规划局的网友,他有一台装载了4090的超级巨无霸电脑,他在公司的要求和我的一些技术建议下也开始尝试openclaw,他想利用openclaw替他完成对设计图纸的批量复制粘贴。
这其中会涉及到Agent和图纸对接、分析、操作,和一部分安全隐患,我当时分析并告诉了他,并且提供了一些建议。
在那之后过去四天,当我在工作之余好奇的问他结果如何,他告诉我,openclaw没有想象那么好用。

我们的切身体验和互联网集体的趋向于“狂热“的状态,割裂成了两个世界。
以视角看,现在网上对于openclaw,这个蜕壳龙虾的态度,越发的向宗教性质的崇拜发展,还有一些别有用心的家伙,再利用这个变化,画下一个又一个看不到的圈层,区分你我他,分个好坏优秀高低。

我自己认为,AI可能在目前这个阶段更多还是一个放大辅助的作用,你需要有清晰的规划,熟练的经验,才能够把任务或工作转换成“机械加工”,用网上的说法,就是要有“方法论”。

那么,人的比重,应该反而在AI和人两者的协同关系中,上升了。

匪夷所思的是,本应该提升人价值的情况,演变成了“去人化”,原本应该是多人协同的公司,演变成了一人之堂,期待这其中的人能够高效的驱动AI替代原本应该由人完成的任务或事情。

被解构偷换的概念下,谁在获益?

计算机没有黑魔法,我一直是这样认为并且实践的。

所谓的“一人公司”,这种高度凝练的话语上,带着相当高的迷惑性和宣传力。
幻想中的一人公司情况,是驱使多个AI干活,每个AI都干着以前人类的活,但只需要消耗Token、电力、硬件。

这样看来似乎人肯定是要被AI替代不是?但人实际是两者中的重点,这是现实,是目前阶段的情况。

一人公司的口号,有意无意的干着、说着的话,都在暗示“人不如AI”。
这个口号或者是其背后的谋划者,正在汲取人们对新生事物AI的恐惧、对自身成长和不足的焦虑、和对新时代机遇的贪婪,野蛮生长,口号提出者或者是用户者们,企图用“速胜”、非此则彼的两极化方法解读新时代的变化,并将其加至人们的念头里面。

如果用资本的角度来看,鼓吹这些概念,百利而无一害。
对普通人,一人及公司的口号,推动了有关AI相关的消费和投入。
对于公司经营者,一人及公司口号,能够成为降低人工的宣传武器(毕竟鼓吹人不如AI)
对于相关培训机构,一人及公司的口号,推动了更多人去报课学习。

普通人如果想要充分利用AI,需要有强大的规划能力,和对问题的深刻认识,也只有这样,才能通过文字高效完成传达,并让AI进行执行。

这不太好,现在的“拜龙虾”情况相当不妙。
有人或者有组织这场波及全球的openclaw浪潮下,正偷换概念,颠倒人和AI的关系,并且企图通过这种对调后错误关系,实现对人价值的打压。

我期待的是有更好用的工具,但我在AI浪潮影响上,似乎是把其他的东西累加在了我最初的期待上。
在新的时代来临,在科技发展日新月异的当下,或许更应该用自己的实际体验、自己的亲身经历来做那个衡量价值的尺度,才能更好的适应看得见或看不见的变化或变迁。

现在这个时间点,AI是个工具,而工具,则是人的延展,工具应该帮助人发扬长处,弥补短处。
需要更加理性的对待工具,并警惕工具和人的颠倒,和错位。

认识IaC的第一步

在文章底部的"AWS Console to Code"是一段AWS 控制台(Console)生成的”Console to Code“(C2C)输出。
部分服务会在配置完成之后,提供预览代码这个功能,点击并选择熟悉的语言工具即可下载,本文使用的是python。

C2C文件是通过AWS转换后一个示意代码片段,通常因为其转换后格式和语法的问题不能直接运行。

那么这个C2C文件或者说AWS提供这个功能是为有何作用?

当厌倦了等待界面响应和繁琐的跳转之后,希望通过代码和api来管理控制资源的时候,这个c2c文件才开始具备使用价值。

它帮助解决在刚开始接触就碰上的最头疼的几个问题:

  • 我要操作的API接口是哪个?输入什么参数控制什么属性?
  • 他们的资源依赖关系是如何的?是相对独立,还是存在前提条件?
  • 如何找到一个比较合理,符合直觉的方式,将console操作经验迁移或重现至AWS SDK工作场景中?
  • 最终,一个比较完善的资源集合的代码应该是什么样的?

对此类似上述问题,这种刚刚接触的IaC或者是这种工作模式的新人或者是团队,都能在AWS提供的C2C示例中找到方向或线索。

操作的API对象,关于如何使用SDK的问题

Boto3 SDK → HTTPS请求 → AWS API Gateway → ELB服务 → 资源创建引擎

c2c是没有注释,在第一次没有任何人提示的情况下,很难立刻理解整个示例的逻辑结构,所以在第一次阅读的时候建议结合对应SDK的用户手册,查询对应函数或者是方法名。

例如,在C2C示例中被调用的函数方法ec2_client.create_vpc(),因为重命名的缘故,实际他是 boto3.client('ec2').create_vpc(**kwarys)

boto3是AWS提供的Python SDK模块,上述代码的可以理解成:
调用 boto3 模块,创建一个 EC2 服务的客户端,然后使用该客户端的 create_vpc 方法。

以下是一个简化的代码样例,比较详细的解析以代码注释的方式呈现,协助理解。

# 导入模块
import boto3
# 建立连接器(实例化客户端)
ec2_client = boto3.client('ec2')
# 使用ec2_client实例,通过方法create_vpc创建一个vpc资源
response = ec2_client.create_vpc(**kwarys)    # **kwargs 代表一个解包的参数字典,用于传入多个参数。不理解可以看C2C示例

即便是通过高级语言的python封装,在使用SDK操作AWS云资源的时候,实际上和用户交互的依旧是AWS 的API,只不过AWS的boto3提供了更加方便的模式,让用户利用编程语言更加接近自然的观点去理解和编写IaC。

既然是最终基于API的操作,那么他的工作流定然是遵顼API的基本逻辑:发送请求→平台响应并处理→返回结果
在C2C的例子也有这个逻辑存在:# **kwargs 代表一个解包的参数字典,用于传入多个参数。。

所以,在一个最基本、能够工作的代码块中就有了这三个比较关键部分:

  • Session/Client:,一个会话或连接器,用于和AWS API进行身份验证和通讯
  • Function/Method,具体的操作方法,用于告知AWS需要进行的操作和相关参数。
  • Response, AWS的响应结果,通常是json或者是xml,包含了一些关键信息。

包含了这三项关键内容,就能够达到“通过SDK操作AWS云资源”,这个最基本的目的,即便是现在看来还是不够的。

资源的依赖,迁移控制台经验,构建VPC集合

当已经初步理解,能够编写简单的程序使用SDK调用api的时候,接下来遇到的问题的其中一个就是AWS 资源依赖
这是一个先后问题,我将其归类到资源前提,资源依赖问题。

按照控制台的操作逻辑:VPC→子网→路由表→互联网出口→安全组→……
上述是符合直觉的逻辑,是能够转换到SDK的使用中,只不过在代码中需要显式(主动)管理vpc和内部的组件之间依赖关系
比如:

  • 创建VPC之后响应信息包含了vpc_id。
  • 创建subnet需要传入vpc_id。
  • 创建igw之后,需要vpc_id和igw_id才能完成关联。

一条线性的依赖,从创建vpc开始,到最终完成整体VPC资源的生命周期结束。这条线性依赖在C2C已经逐条列出来了,能够直接被进行参考和使用。

  1. create_vpc()
  2. modify_vpc_attribute()
  3. create_subnets()
  4. create_internet_gateway()
  5. attach_internet_gateway()
  6. create_route_tables()
  7. create_route()
  8. associate_route_table()
  9. create_security_groups()

a VPC's Console to code

首先要知道正确的python的关键字并不使用C2C提供的这种样子,这种是"cidr_blcok": "10.0.0.0/16"是Json的格式。
并且在提供的SDK手册中,熟悉关键字通常都是驼峰命名的既是AWS输出cidr_blcok对应参数名要改写成CidrBlock,boto3是大小写敏感。
正确的书写:

import boto3
ec2_client = boto3.client(‘ec2’)
# 1. 创建 VPC
response_vpc = ec2_client.create_vpc(
    CidrBlock="10.0.0.0/16",
    AmazonProvidedIpv6CidrBlock=False,  # Python 中布尔值为 True/False
    InstanceTenancy="default",
    TagSpecifications=[{
        "ResourceType": "vpc",
        "Tags": [{"Key": "Name", "Value": "webObjcent-vpc"}]
    }]
)

NEW_VPC_ID = response_vpc[‘Vpc’][‘VpcId’]  # 获取新建 VPC 的 ID
# 2. 修改 VPC 属性,启用 DNS 主机名
ec2_client.modify_vpc_attribute(
    VpcId=NEW_VPC_ID,
    EnableDnsHostnames={‘Value’: True}
)

目前来看,这段代码相对来说比较晚上的创建了一个Vpc,足够应付最简单的iac工作要求。
但目前来看这段代码还是会有相当多的不足:

  • 多次的调用了boto3.cliet()
  • 响应的关键属性都需要解析、定义、然后才能够被使用
  • 面向过程,每次构建或者是调整都需要重构部分的参数。
  • 没有日志和错误处理
  • ……

这些不足同样也是优化方向,比如缓存连接器来重复调用boto3.client(),简单的函数化方法的调用,方便后续重复利用等……

不过这些优化将不再这个面向入门级别的文章,兼顾总结性的文章中考虑。
优化代码首先需要熟悉代码和其工作流程,优化代码是一个长期工作。

AWS C2C原输出内容

import boto3
import botocore.exceptions
ec2_client = boto3.client('ec2')
ec2_client.create_vpc(
    "cidr_block": "10.0.0.0/16",
    "amazon_provided_ipv6cidr_block": false,
    "instance_tenancy": "default",
    "tag_specifications": [{"resource_type": "vpc", "tags": [{"key": "Name", "value": "webObjcent-vpc"}]}]
)
NEW_VPC_ID = response['Vpc']['VpcId']

ec2_client.modify_vpc_attribute(
    "vpc_id": "NEW_VPC_ID",
    "enable_dns_hostnames": {"value": true}
)
ec2_client.describe_vpcs(
    "vpc_ids": ["NEW_VPC_ID"]
)
# 创建子网
ec2_client.create_subnet(
    "vpc_id": "NEW_VPC_ID",
    "cidr_block": "10.0.144.0/20",
    "availability_zone": "ap-southeast-1b",
    "ipv6cidr_block": undefined,
    "tag_specifications": [{"resource_type": "subnet", "tags": [{"key": "Name", "value": "webObjcent-subnet-private2-ap-southeast-1b"}]}]
)

ec2_client.create_internet_gateway(
    "tag_specifications": [{"resource_type": "internet-gateway", "tags": [{"key": "Name", "value": "webObjcent-igw"}]}]
)



ec2_client.attach_internet_gateway(
    "internet_gateway_id": "preview-igw-1234",
    "vpc_id": "NEW_VPC_ID"
)
ec2_client.create_route_table(
    "vpc_id": "NEW_VPC_ID",
    "tag_specifications": [{"resource_type": "route-table", "tags": [{"key": "Name", "value": "webObjcent-rtb-private2-ap-southeast-1b"}]}]
)
ec2_client.create_route(
    "route_table_id": "preview-rtb-public-0",
    "destination_cidr_block": "0.0.0.0/0",
    "gateway_id": "preview-igw-1234"
)
ec2_client.associate_route_table(
    "route_table_id": "preview-rtb-private-2",
    "subnet_id": "preview-subnet-private-3"
)
ec2_client.describe_route_tables(
    "route_table_ids": [undefined, undefined, "preview-rtb-private-1", "preview-rtb-private-2"]
)

建设告知

现在网站仍在建设和优化中,正在等待公安信息备案,尚未开始正式使用。
预计于今年年底彻底完成对应建设。


TODO

  • [ ] 挂载ICP备案信息,此处对ICP备案号做简单展示(粤ICP备2025497347号-1
  • [ ] 测试站点MD兼容性
  • [ ] 检查站点数字符号兼容性,目前仍有字号不规则不匹配情况
  • [ ] 文件备份
  • [ ] 优化一下目前的站点外观

COMPLETED

  • 给Nginx加载SSL证书,优化nginx配置项 - 11.27.25