LlamaIndex 深度实战:用《长安的荔枝》学会构建智能问答系统

作者: 殊文 来源: 微信公众号 推荐理由 这篇文章的亮点在于将复杂的技术概念用通俗易懂的故事来讲解,让读者能够快速理解 RAG(检索增强生成)的核心原理,同时还提供了 LlamaIndex 的实战代码示例。 文章兼顾了 RAG 的科普与 LlamaIndex 的实战,适合不同水平的读者 提供了清晰的学习路径,新手可以从原理篇开始建立核心概念 使用生动的比喻(用《长安的荔枝》的故事)来解释 AI 如何"读书"的 RAG 技术 阅读原文 点击下方链接阅读完整文章: LlamaIndex 深度实战:用《长安的荔枝》学会构建智能问答系统 本文分享自微信公众号,仅供学习参考

2026年01月17日

微信公众号订阅工具 wewe-rss

前言 最近发现了一个非常优雅的微信公众号订阅工具 wewe-rss, 分享一下… 这个工具可以将微信公众号的文章订阅到自己的 RSS 阅读器中,方便在不打开微信的情况下查看最新的文章。而且也不用看微信的里的广告了。 效果图如下: docker 部署补充说明 项目源码:https://github.com/cooderl/wewe-rss wewe-rss 项目里有详细的部署说明。但是我用 docker 部署时,遇到了两个问题: 配置了阿里云镜像加速器,依然无法拉取到 cooderl/wewe-rss 镜像。 数据库中的数据查询时中文显示乱码。 具体解决办法: 在 docker 配置文件中, 额外加其他几个镜像加速器: sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://私有的阿里云镜像加速器.mirror.aliyuncs.com" "https://dockerpull.org", "https://dockerhub.icu", "https://docker.1ms.run", "https://docker.chenby.cn" ] } EOF 修改 docker-compose.yml 文件, 加上客户端连接的字符集设置, 具体操作如下: # 创建 wewe-rss 目录和配置文件 mkdir -p ~/apps/wewe-rss touch ~/apps/wewe-rss/docker-compose.yml mkdir -p ~/apps/wewe-rss/mysql-conf touch ~/apps/wewe-rss/mysql-conf/charset.cnf # 添加 docker-compose 配置文件内容 tee ~/apps/wewe-rss/docker-compose.yml <<-'EOF' services: db: image: mysql:8.0 container_name: db networks: - wewe-rss volumes: - db_data:/var/lib/mysql - ./mysql-conf/charset.cnf:/etc/mysql/conf.d/charset.cnf:ro environment: MYSQL_ROOT_PASSWORD: your_password TZ: Asia/Shanghai MYSQL_DATABASE: wewe-rss command: - --default-authentication-plugin=mysql_native_password - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci healthcheck: test: ['CMD', 'mysqladmin', 'ping', '-h', 'localhost', '-uroot', '-p$$MYSQL_ROOT_PASSWORD'] interval: 5s timeout: 5s retries: 10 start_period: 30s restart: always wewe-rss: image: cooderl/wewe-rss:latest container_name: wewe-rss ports: - '4000:4000' depends_on: db: condition: service_healthy networks: - wewe-rss environment: DATABASE_URL: mysql://root:your_password@db:3306/wewe-rss?schema=public&connect_timeout=30&pool_timeout=30&socket_timeout=30 AUTH_CODE: 123567, restart: always networks: wewe-rss: driver: bridge volumes: db_data: EOF # 配置数据库字符集 tee ~/apps/wewe-rss/mysql-conf/charset.cnf <<-'EOF' [mysql] default-character-set=utf8mb4 [client] default-character-set=utf8mb4 EOF # 启动 wewe-rss 容器 docker compose up -d

2026年01月17日

Python协程详解

什么是协程 协程 (Coroutine), 也被称为微线程, 是一种比线程更轻量级的存在。简单来说, 协程是一种用户态的轻量级线程, 协程的调度完全由用户控制。 协程 vs 线程 vs 进程 特性 进程 线程 协程 切换开销 最大 中等 最小 内存占用 最大 中等 最小 并发能力 多进程并行 多线程并发 单线程内并发 数据共享 IPC复杂 共享内存, 需要锁 无需锁 创建数量 少量 中量 大量 协程的核心优势: 极低的上下文切换成本 单线程即可实现高并发 避免了多线程的锁竞争问题 代码结构清晰, 逻辑同步 协程的基本概念 生成器 (Generator) 在Python 3.5之前, 协程是通过生成器实现的。生成器是一种特殊的迭代器, 可以在执行过程中暂停和恢复。 def simple_generator(): print("开始执行") yield 1 print("继续执行") yield 2 print("结束执行") # 创建生成器 gen = simple_generator() # 手动迭代 print(next(gen)) # 输出: 开始执行, 1 print(next(gen)) # 输出: 继续执行, 2 print(next(gen)) # StopIteration yield 关键字 yield 类似于 return, 但不会结束函数 每次调用 next() 时, 生成器执行到 yield 并返回值 下次调用 next() 时, 从上次的 yield 继续执行 def countdown(n): print("开始倒计时") while n > 0: yield n n -= 1 for i in countdown(5): print(i) # 输出: # 开始倒计时 # 5 # 4 # 3 # 2 # 1 send() 方法 生成器的 send() 方法可以向生成器内部发送数据: ...

2026年01月17日

最强开源 Coding 模型 GLM-4.7

GLM-4.7 模型 GLM-4.7 是目前智谱 AI 的最新旗舰模型, 真是让人眼前一亮的模型👍🏻👍🏻👍🏻. 总结下 GLM-4.7 特点: Coding 能力极强(开源模型中第一, 几乎和最强的闭源 Claude Opus 4.5 模型能力相当). 便宜, 现在 活动 购买 GLM Coding Lite 套餐 54 元/季, 巨划算. 无缝适配 多种主流 AI 编程工具(Claude Code, Cline 等 20+ 编程工具), 配置非常简单, 给智谱点赞!!! 附一张官网的图:

2025年12月30日

FastAPI 实战指南

一、FastAPI简介 1. 什么是 FastAPI? 参考官网原文: FastAPI is a modern, fast (high-performance), web framework for building APIs with Python based on standard Python type hints. FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于标准 Python 类型提示构建 API。 2. FastAPI 与其他框架对比 特性 FastAPI Flask Django 性能 高 中等 中等 异步支持 原生支持 需要扩展 需要扩展 类型提示 必需 可选 可选 自动文档 内置 需要扩展 需要扩展 学习曲线 中等 低 高 适合场景 REST API 小型应用 大型全栈应用 3. FastAPI 的核心特性 FastAPI 基于以下核心特性和标准构建: OpenAPI:FastAPI 使用 OpenAPI 标准为你的所有 API 创建定义,包括定义路径、参数、请求体、安全等 JSON Schema:由于 OpenAPI 基于并使用 JSON Schema 进行模型定义,FastAPI 使用 Pydantic 的模型定义提供 JSON Schema 自动文档:交互式 API 文档(Swagger UI)和备用文档(ReDoc)会根据定义的 OpenAPI 自动生成 现代 Python:完全基于 Python 3.6+ 的类型提示开发,充分利用现代 Python 特性 依赖注入:FastAPI 拥有强大且易用的依赖注入系统,使代码更简洁、更易于测试和复用 安全性与认证:内置支持 OAuth2 和 JWT 认证,以及 API Key 等标准安全机制 异步支持:原生支持 async/await,可以编写异步代码,提高并发性能 数据验证:使用 Pydantic 进行数据验证,自动将请求数据转换为 Python 类型 自动类型转换:自动将请求中的字符串转换为 Python 类型,减少手动转换代码 参考:FastAPI 官方文档 - Project Documentation ...

2025年12月29日

Text-to-SQL Agent

源代码 源码链接 本地运行方式参考 README 中的说明. 功能介绍 基于 LangChain 1.1 + deepseek 大模型 实现的 Text2SQL Agent, 支持通过自然语言查询 PostgreSQL 数据库中的数据. 效果图 tooken 消耗 得益于 deepseek 便宜的定价(百万tokens输入输出, 5元), 1毛钱大约可以问 20个 中等复杂的问题. 其他 text-to-sql 开源实现 pandas-ai vanna

2025年12月05日

一致性哈希 - Consistent Hashing

在分布式系统中,一个核心挑战是如何 将数据均匀分布到多个服务器上,并且在系统扩容或缩容时,尽量减少数据迁移。 一致性哈希(Consistent Hashing) 算法就是为了解决这个问题而提出的,它在缓存系统、负载均衡、分布式存储(如 Cassandra、Amazon Dynamo)中都有广泛应用。 传统哈希的局限性 设想这样一个场景:我们有 4 台缓存服务器 S1、S2、S3、S4,需要存储大量键值对。 一种常见的方式是对 key 取哈希值,然后用取模运算来决定放在哪台服务器上: server = hash(key) % N 其中 N 是服务器数量。 这种方法虽然简单,但有一个致命问题: 当服务器数量变化时,几乎所有数据都需要重新分布。 比如,当我们从 4 台扩容到 5 台服务器时: 原映射: server = hash(key) % 4 新映射: server = hash(key) % 5 几乎所有 key 的哈希值都会对应到新的服务器上,造成大量缓存失效和数据迁移。这在大规模系统中是不可接受的。 一致性哈希的核心思想 一致性哈希通过引入 哈希环(Hash Ring),巧妙地解决了这个问题。 哈希环的构建 一致性哈希将整个哈希空间(比如 0 到 2³²-1)首尾相连,形成一个 环形结构: 0 → 1 → 2 → ... → 2³²-1 → 回到 0 然后,将 服务器节点 通过 哈希函数 映射到环上的某个位置: hash(S1) → 环上的一个点 hash(S2) → 环上的另一个点 ... 同样,每个 key 也会被哈希映射到环上的某个点: hash(key) 数据的分配规则 数据的放置: 从 key 的位置开始,顺时针找到第一个服务器节点,该服务器就是 key 的归属节点。 例如, 如果 key1 的哈希值在 S2 和 S3 之间,那么它会被分配给 S3。 ...

2025年10月30日

Redis 指南

1. 什么是 Redis? Redis(Remote Dictionary Server)是一款开源的内存数据存储系统,它广泛应用于缓存、会话存储、消息队列等场景。它的核心特点包括: 键值对存储:Redis 使用简单的键值对模型存储数据,每个键都可以关联不同的数据类型。 内存存储:所有数据都保存在内存中,提供了非常快速的读写操作。 持久化支持:Redis 支持数据持久化(RDB 和 AOF),即使在系统崩溃时,数据也可以恢复。 丰富的数据结构:除了常见的字符串(String),Redis 还支持哈希(Hash)、列表(List)、集合(Set)、有序集合(Zset)等数据结构。 2. Redis 架构和设计 Redis 的架构设计简单而高效。它采用了单线程模型,通过事件循环处理所有的请求,避免了多线程带来的上下文切换开销。 单线程模型 虽然许多数据库使用多线程来并发处理多个请求,但 Redis 的单线程模型通过事件驱动和非阻塞 I/O 实现了高效的并发操作。Redis 的单线程能够避免多线程带来的上下文切换开销,从而提高了性能。 数据持久化 RDB(Redis DataBase):通过快照的方式将数据保存到磁盘,适用于容灾备份。 AOF(Append-Only File):记录每个写操作的日志,能够提供更精细的持久化控制。通过重写日志文件,减少文件大小。 Redis 的高可用性和扩展性 主从复制 Redis 支持主从复制(master-replica),即将数据从主节点同步到从节点,从而提高数据的可靠性和读取性能。(参考Redis replication) Sentinel 高可用性 Redis Sentinel 是 Redis 的高可用性解决方案,它提供了自动故障转移、监控和通知等功能。在 Sentinel 的帮助下,Redis 能够在主节点故障时自动切换到从节点,保证系统的高可用性。(参考Redis Sentinel) Redis 集群 Redis 集群是 Redis 提供的分布式解决方案,通过分片的方式将数据分布到多个节点中,从而实现数据的水平扩展。Redis 集群具有自动分片、自动故障转移和高可用性等特点。(参考Redis Cluster) 3. Redis 的常见数据类型 Redis 支持多种数据类型(参考Redis 数据类型),开发者可以根据不同的需求选择最合适的数据结构来存储数据, 下面是 5 种最基本的数据类型: String:字符串类型,支持各种操作,如设置值、获取值、递增递减等。 Hash:哈希类型,适用于存储对象数据,键值对的结构可以用于存储和操作复杂的数据。 List:列表类型,提供类似队列的功能,支持从两端插入和删除元素。 Set:集合类型,支持无重复元素的集合操作,适合用于去重和集合操作。 Zset(有序集合):为每个元素关联一个分数,可以根据分数排序元素,适用于排行榜等场景。 4. Redis 的缓存策略与淘汰策略 缓存过期策略 Redis 提供了多种缓存过期策略,如: ...

2025年10月30日

Metabase 指南

前言 Metabase 安装, 参考这里。 Metabase 是一个 “商业智能”(BI)平台,它为您提供了大量了解和共享数据的工具。(原文) Metabase 的核心作用: 数据可视化: Metabase 提供了丰富的图表和可视化工具,帮助用户 将数据转换为图表和图形。 数据分析: 用户可以使用 Metabase 进行数据分析,包括筛选、排序、聚合和计算等操作。 数据共享: Metabase 允许用户将分析结果分享给其他用户,以便团队成员之间进行合作和沟通。 数据权限管理: Metabase 提供了灵活的权限管理功能,用户可以根据需要设置数据的访问权限,确保数据的安全性和隐私性。 我最近用到 Metabase, 是因为 账单管理系统 内部没有实现 账单数据解析功能, 只能用 Metabase 连接数据库做分析。 项目地址 下面是我使用 Metabase 的一些经验。 简介 核心概念: 数据库: Metabase 连接到数据库,用户可以在 Metabase 中查询和分析数据库中的数据。 Collection: 用于组织和管理数据集, 可以把 dashboard, question, model 放在 collection 中, 可以把 collection 理解为文件夹。 Question: 查询数据, 有两种类型: graphical query builder(Metabase 提供的查询方式) 和 native query editor(原生SQL查询方式)。 Dashboard(看板): 可以在看板中添加图表、表格、指标等元素,以展示数据的趋势、分布、对比等信息。 Model: 相当于 数据库中的 视图。 主页示例: ...

2025年09月09日

NGINX 指南

简介 nginx 安装方法 参考 Installing nginx。 nginx 是一个高性能的 HTTP 和 反向代理服务器(Reverse Proxy Server),也可以做 IMAP/POP3/SMTP 代理服务器。 nginx 作用: 作为 HTTP 服务器,处理静态资源请求。比如 博客网站静态文件, 前端项目打包后的文件, 图片、视频等文件。 作为 反向代理服务器, 将客户端请求 转发到后端服务,并将后端服务器的响应返回给客户端。 反向代理服务器 处理的一般也是 HTTP 请求。本文不严格区分 HTTP 服务器 和 反向代理服务器。 什么是 HTTP 服务器? HTTP 服务器 (HTTP Server) 是一种 提供网页内容服务的程序, 它基于 HTTP (HyperText Transfer Protocol, 超文本传输协议) 来处理客户端(通常是浏览器)的请求, 并返回响应。 HTTP 服务器的基本工作流程: 监听端口 HTTP 服务器通常监听 80 (HTTP) 或 443 (HTTPS) 端口。 接收请求 客户端(如浏览器、移动端)通过 URL 发送 HTTP 请求, 服务器接收请求报文。 请求内容包括方法 (GET、POST、PUT、DELETE 等)、路径、请求头和请求体。 处理请求 HTTP 服务器根据请求内容找到对应的资源 (如 HTML、图片、API 接口程序), 或把请求转发给 后端应用程序 (这就是反向代理的功能)。 返回响应 HTTP 服务器生成 HTTP 响应报文 (状态码、响应头、响应体), 发送给客户端。 浏览器再把响应内容渲染出来。 nginx 进程模型 nginx 有 一个主进程(master process) 和 多个工作进程(worker process)。 master 进程 的主要作用是 读取和解析 nginx 配置文件, 并维护工作进程。 worker 进程 的主要作用是 处理实际的请求。 ...

2025年09月08日

Python-进阶篇

类与对象 类与对象 类 (Class): 模板,定义属性和方法。 对象 (Object): 类的实例 (Instance)。 # 定义类 class Person: """简单类示例""" species = "人类" # 类变量 def __init__(self, name: str, age: int): self.name = name # 实例变量 self.age = age def greet(self) -> str: # 实例方法 return f"Hi, I'm {self.name}, {self.age} years old." # 创建对象 p = Person("Alice", 30) print(p.greet()) # Hi, I'm Alice, 30 years old. print(Person.species) # 人类 要点: __init__ 是 初始化方法, 在实例创建后被调用。 self 表示当前对象的引用(self虽不是关键字, 但约定俗成), 用来访问对象的属性和方法。方法调用时 Python 自动传入,不需要手动写。 类变量 在所有实例间共享, 实例变量是每个实例独有的。 实例变量/类变量/私有变量 实例变量 (Instance Variables): 属于特定实例(对象)的变量,每个实例都拥有自己独立的一份副本。 特点: 在 __init__ 构造函数 或 其他实例方法中 通过 self.变量名 定义 每个对象的 实例变量值 可以不同 类变量 (Class Variables): 属于类本身的变量,被所有实例共享。 特点: ...

2025年09月01日

Python-入门篇

变量 变量就是 存储数据的容器,用一个名字指向一块内存中的值。 在 Python 中,变量本质上是 对象的引用。 变量命名规则: 只能包含 字母、数字、下划线, 不能以数字开头 不能是 关键字 区分大小写 推荐命名规范(PEP8): snake_case(变量名小写,单词之间用下划线隔开) 用于 变量、函数、方法、模块。 PascalCase 专门用于 类名。 示例: 标识符类型 示例 变量名 user_name, is_valid 函数名 calculate_total(), get_user_data() 方法名 class_instance.update_status() 模块名 my_module.py, data_processor.py 包名 package_name 类名 HttpRequest, User 常用的内置数据类型 Python 中 常用的内置数据类型: 数据类型 中文名 示例 int 整型 10 float 浮点型 3.14 bool 布尔型 True str 字符串 “hello word” NoneType 空类型 None list 列表 [1, 2, 3] tuple 元组 (1, 2, 3) set 集合 {1, 2, 3} dict 字典 {“key”: “value”} Python 是 动态类型语言,不需要显式声明变量类型,解释器会根据赋值自动推断类型。 示例: ...

2025年08月31日

文件双向同步

前言 最近公司做双活, 一套应用部署在异地的两个机房, 其中, 存放归档文件的 nas 也是两套, 两套 nas 需要双向同步. 如果是 单向数据同步 的话, 有两种方法: 方法 1: 可以采用 inotify + rsync 实现. 实现示例 方法 2: 也可以用 lsyncd 实现, lsyncd 封装了 inotify + rsync, 本质上和 方法1 一样. rsync 是专门做单向同步(从源同步到目标)的, 但是不具备 冲突检测 和 变更协调的能力, 因此不能做 双向数据同步. 经过一番搜索, 我找到一个可以 实现双向数据同步的工具 — Syncthing. Syncthing 是一个开源的 文件同步工具。它能在两台或多台计算机之间实时同步文件,并安全地防止他人窥探。 这篇文章介绍一下 Syncthing 的使用. 介绍 Syncthing 中有两个术语: (device)设备 和 文件夹(folder). 设备 就是安装了 Syncthing 程序的计算机, 设备 分为: 本地设备(local device) 远程设备(remote device) Syncthing 会给每个 设备 分配一个 设备ID, 我们可以把 本地设备 和 远程设备 通过 设备ID 建立双向连接. ...

2025年08月30日

Linux 文本处理之 sed

sed (Stream Editor, 流编辑器) 是 Linux 中的 文本处理工具, 常用于对文本进行 查找、替换、删除、插入、提取等批处理操作。 基本语法: sed [选项] '命令' 文件 # 或者: 命令 | sed [选项] '命令' 常用选项: 选项 说明 -n 默认 sed 会打印所有行, 使用 -n 后只会输出符合条件或被命令处理的行 -e 用于指定多条命令 -i 直接修改源文件(慎用, 建议先备份) -r 启用扩展正则表达式 (也可以用 -E) -f 从文件中读取 sed 命令 常用命令: 命令 说明 p 打印 d 删除 s/old/new/ 查找并替换 a\text 在当前行后追加一行 i\text 在当前行前插入一行 c\text 替换当前行内容 = 打印当前行号 q 处理到此行后退出 常见用法示例 打印文本 # 打印所有行: sed '' file.txt 打印匹配到 error 的行: sed -n '/error/p' file.txt # 只打印第 2 行: sed -n '2p' file.txt # 打印第 2 到第 4 行: sed -n '2,4p' file.txt 查找并替换 # 只替换每行的第一个匹配: sed 's/error/warning/' file.txt # 替换每行所有匹配: sed 's/error/warning/g' file.txt # 忽略大小写替换: sed 's/error/warning/gi' file.txt # 如果文本中有特殊字符, 如 /, 换分隔符: sed 's|/usr/local|/opt|g' file.txt # 使用变量: word="error" sed "s/$word/warning/g" file.txt # 替换并直接修改文件: sed -i 's/error/warning/g' file.txt # 直接修改文件并备份: sed -i.bak 's/error/warning/g' file.txt # 正则, 替换数字为 X: sed 's/[0-9]/X/g' file.txt 删除文本 # 删除第 2 行: sed '2d' file.txt # 删除第 2 到第 4 行: sed '2,4d' file.txt # 删除匹配 debug 的行: sed '/debug/d' file.txt # 删除所有空行: sed '/^$/d' file.txt # 删除以 # 开头的注释行: sed '/^#/d' file.txt 插入、追加、替换 # 在第 2 行前插入一行: sed '2i\This is a new line' file.txt # 在第 3 行后追加一行: sed '3a\Another new line' file.txt # 把第 2 行替换成新的内容: sed '2c\This line is replaced' file.txt

2025年08月22日

Linux 文本处理之 awk

引例 有个 1.txt 文件, 内容如下: 1755741361|文件1|事件1 1755741374|文件1|事件2 1755741385|文件2|事件3 第一个字段是时间戳, 在查看这个文件时为了看清时间, 需要把时间戳转为字符串: while IFS='|' read ts rest; do echo "$(date -d @$ts '+%Y-%m-%d %H:%M:%S')|$rest"; done < 1.txt 结果: 2025-08-21 09:56:01|文件1|事件1 2025-08-21 09:56:14|文件1|事件2 2025-08-21 09:56:25|文件2|事件3 用 awk 也可以实现一样的效果, 代码更简洁: awk -F'|' '{ OFS="|"; $1 = strftime("%Y-%m-%d %H:%M:%S", $1); print }' 1.txt awk 简介 awk 是 Linux 文本处理三剑客之一(grep, awk, sed)擅长 按行按列 处理数据。 awk 是一个 文本处理工具,也是一门轻量的脚本语言。 主要功能: 按行处理文本,按列处理数据。 使用场景: 日志分析、数据转换/提取等。 基本语法: awk 'pattern { action }' file pattern:模式,用来匹配哪些行需要处理. 省略 pattern 时, 所有行都执行动作 action:动作,告诉 awk 对匹配的行要做什么. 省略 action 时, 默认动作是 print $0(打印整行) ...

2025年08月21日

Linux: 运维篇

前两天写了 “Linux: shell 脚本篇”, 其中不涉及运维相关的内容, 因此新写了 “Linux: 运维篇” 作为补充. 磁盘与文件信息 df 命令 (disk free) df - 查看磁盘分区的空间使用情况 df -h # 参数说明: # -h 以人类可读的方式显示 (自动用 KB/MB/GB) # -T 显示文件系统类型 # -i 查看 inode 使用情况 (避免 inode 用完导致无法写入) du 命令 (disk usage) du - 查看目录或文件所占空间 du [选项] [文件/目录] 注意: du 显示的是磁盘实际占用大小, 可能和 ls -l 显示的文件大小不同, 因为磁盘按块分配空间 (即使文件很小也会占一个块) 常用参数: 参数 含义 示例 -h 以人类可读方式显示 (KB/MB/GB) du -h /var/log -s 只显示总计 (summary), 不递归 du -sh /var/log -a 显示目录和文件的大小 du -ah /var/log –max-depth=N 限制目录递归深度 du -h –max-depth=1 /var -c 显示总计 (最后一行 total) du -ch /var/log 常用组合: ...

2025年08月13日

Linux: shell 脚本篇

平时写 Java, Python, 甚至一些前端代码. 但最近工作上要写 shell 脚本, 发现有些生疏了, 这篇文章记录一些基本的 shell 脚本写法, 偶尔翻翻, 加深记忆. 因为此文目的是复习 常用的 shell 脚本写法, 所以文中不会很细节. set -euo pipefail set -euo pipefail 是三个 set 选项组合在一起,用来让脚本执行时更严格、更安全。 set -e 作用: 当任何命令返回 非零状态码(执行失败) 时,立刻退出整个脚本。 默认情况下,Bash 脚本就算中间某个命令失败,也会继续执行。 set -u 作用: 当脚本中使用未定义的变量时,立即报错并退出。 默认情况下,使用未定义变量会被当成空字符串处理,不会报错。 set -o pipefail 作用: 让管道 (|) 命令在任意一环节失败时,都返回失败状态码。 默认情况下,管道命令的返回值是最后一个命令的返回值。 如果前面命令失败,但最后一个命令成功,脚本也会认为成功,这是有风险的。 开启 pipefail 后,管道中只要有一个命令失败,整个管道就会被视为失败。 控制语句 条件判断(if/else) if [ 条件表达式 ]; then 命令 elif [ 条件表达式 ]; then 命令 else 命令 fi 例子: #!/bin/bash num=5 if [ $num -gt 10 ]; then echo "大于10" elif [ $num -eq 10 ]; then echo "等于10" else echo "小于10" fi 函数返回值: ...

2025年08月11日
图片描述

聊聊 AI 编程 - Cursor

1. 前言 Cursor 发展简介[1] 时间 说明 2023 年 Anysphere 发布了 公开测试版 的 Cursor 2024 年 因为其智能的代码生成和补全, Cursor 在编程领域 火爆全球 2025 年 4 月 15 发布 Cursor 0.49, 这是官网 Changelog 给出的最早版本 2025 年 6 月 4 发布 Cursor 1.0, 支持: BugBot 代码审查, 记忆 Beta, 一键安装 MCP 等等 2025 年 7 月 3 发布 Cursor 1.2, 目前最新版本 今年 2 月, Anthropic 发布的 AI 编程命令行工具 - Claude Code, 最近十分流行, 网上很多人表示 Claude Code 比 Cursor 更香. ...

2025年07月08日
图片描述

Agent TARS 和 UI TARS 的使用体验

前言 前两天在 字节跳动 的公众号上看到一篇 基于 UI-TARS 的 Computer Use 实现 的文章. 看 demo 感觉和今年年初发布的 Manus 一样, 也是一个通用的 AI agent. 不过 UI-TARS-desktop 是 开源 的. TARS* 目前包括两个项目:Agent TARS 和 UI-TARS Desktop: Agent TARS 是一个 GUI Agent, 运行时会启动一个本地服务, 能通过浏览器访问, 提供了访问 本地终端, 浏览器, 本地文件 的能力. UI-TARS Desktop 是一个提供了 native GUI Agent 能力的桌面应用. 它可以像人类一下操作电脑(鼠标, 键盘). 安装方法在github和官网有详细说明, 下面直接开测. 测试 Agent TARS Agent TARS 目前只支持 3 种模型: 字节跳动的 Seed1.5-VL(doubao-1-5-thinking-vision-pro-250428) Claude 3.7 Sonnet GPT-4o 我用 豆包模型 进行测试. 浏览器使用(Browser Use) 测试一 提示词: ...

2025年07月07日