2025 游戏

今年除了和娃一起玩的双人游戏,我个人已经彻底放弃了PS5。

《双人成行》

游戏的能力也是需要锻炼的,娃从一开始特别手残,到现在已经能偶尔比我玩得好。双人游戏的优点是你必须真的让对方完成,而不是代劳。我们决定把Hazelight Studios的双人游戏三部曲全部打通。

《双影奇境》

和《双人成行》一样的套路,每周娃有20-30分钟的游戏时间,现在快推进到最后四分之一了。

《黑悟空》

手残。一开始的幽魂至少死了30次,看了攻略也不太能上手。后来同样的故事又在白衣秀士上上演,也大概是30多次。等打完第二章已经过去了2个多月,之前看视频学来的招式,如果超过一周没玩就忘记了,重新学习的门槛也不低。现在还停在第三章。不是游戏不好玩(黑魂、老头环我也没玩下去),应该是不适合我这种中年人了。

《美国卡车模拟》

我的Steam账户中当之无愧的用时第一游戏——随时开始随时暂停,顺便看看北美大陆风光。甚至这次自驾南加的国家公园我还在游戏里先体验了一下道路。当然老婆忍不住吐槽——买个4080就让你开10年前的卡车?标准回答是:我还要用来训练机器学习的模型。

已经完成了50%的道路探索,也购买了最新的路易斯安那的DLC地图扩展包。当你开过一个你亲身抵达过的地标的时候,心里不由得发出WoW的声音。隔几天下班以后打开游戏,接上新的派送任务穿行北美大陆——从大平原到大盆地沙漠,从落基山到内华达雪山,从加州海岸到密西西比河港口。

2025 阅读

《人类简史》漫画版

去年偶然间在图书馆借到了《Pinball》,对漫画非虚构产生了一些兴趣。让ChatGPT整理了几本好看的漫画非虚构,第一个推荐的就是《人类简史》,一共有3部,现在看完了1.5本。作者把原书的内容精简后,用漫画的形式画出一个主人公的故事。

《AI工程》

继《Designing Machine Learning Systems》后,Huyen教授去年出版了续篇《AI Engineering》。本该去年就读完,但拖拖拉拉直到现在才看完。这也是我推荐给做AI应用工程方向同学们的必读书。可惜现在公司已经没有了O’Reilly的订阅,图书馆的书也不能长期持有,我让国内出差的同事带了一本影印本(也是正版!)。

Basic Laws of Human Stupidity

很有意思的小册子,记住了几个点子:

  • 蠢人的比例是固定的,无论学历、智商、种族、性别
  • 蠢人指的是损人不利己的那类人,比自私的人(损人利己)危害还大
  • 大家总是低估蠢人的破坏力

《时间的色彩》

可以称之为大部头画册,把当年的黑白历史照片上色(不是用AI),还原历史现场。我还从图书馆借了英文版对照,发现少了大概3页的内容,均和本朝有关。购自京东海外购。

《读库生鲜》

《读库》青春版,同样是非虚构文集,选题更对我胃口(对戏剧和文学的兴趣不大)。因为是类似杂志的发行方式,所以只能托同事带。

《二战危城蒙太奇》

著名历史译/作者(也是校友)陆大鹏的口袋册子,结合了他个人的游记+二战历史,一共9座城市的故事。购自京东海外购。

《敌友难辨》

这些年听了最多播客可能就是沙青青,体制内人,知识面惊人,“流窜”于文化时事类播客。

《我妈已经三天没有打我了》

最后来一个轻松幽默的漫画——如果家里没有一个娃压根画不出这么传神的画面。看看这个封面和封底就知道了。

2025年终小结

这个Blog终于还是变成了年更栏目——年初立下的每月一篇的KPI在一月集中写了几篇之后轰然倒塌,直到年底才想起来。

工作

上半年比较平稳,但下半年开始时候经历了加入公司以来最大的一次重组,工作内容在年底也开始有很大的变化,团队和责任也更大了。

旅行

年中夏天全家一起去了东海岸,特别是娃心心念念的纽约(他是Percy Jackson的大粉丝)。

DC看到了大统领的直升机(他很有可能就在飞机上,去加拿大参加G7)

国家航空航天博物馆的B-29,在广岛投下原子弹的那架ENOLA GAY

黑鸟SR-71,《变形金刚2》中会变形成天火

华盛顿纪念碑

第三次来到911纪念馆

自由女神

拜访了公司纽约办公室,不大但地段不错

哈利波特的百老汇剧

帝国大厦

布鲁克林大桥

年底继续南加自驾,LA的大狼屋两晚+Joshua Tree和Death Valley

棕榈泉,难得一见的下雨天

约书亚树国家公园——拱门石

死亡谷国家公园

体育

现场看了两场比赛,第一次去Levis Stadium,看孙哥大破圣何塞地震

每年例行的勇士比赛,只不过现在升级成了常规赛,位置也从底线的山顶换到了侧面的山顶。亮点是娃跟着俱乐部上场打了2分钟比赛,投了几次篮!

然后看杨瀚森做了48分钟板凳

跟着公司混的赞助商福利,现场见到了麦克拉伦车队的扎克布朗和皮亚斯特里

杂记

换了新的iPhone 17 Pro Max,取代了之前的12 Pro Max

公司的第五台笔记本电脑(第一台是旧的+relocate时候必须换只用了几个月的电脑),升级到M4+128G内存

买了入门级的瓜车(Gravel Bike),重新开始骑行。目标是达成一次到三藩的骑行(大概45迈)

展望

不再立什么flag了,希望新的一年:

  • 家人自己健康
  • 生活/身份稳定
  • 工作接受新的挑战

基于大模型的播客RAG系统搭建攻略(三):开源代码和后续计划

前文链接:

仓库地址https://github.com/liujinmarshall/podcast_rag

首先插播一条新闻。在两周之前,我常用的播客客户端小宇宙推出了会员plus计划:

我们的会员产品“小宇宙PLUS”现已上线,提供「AI播客总结」「收藏时点」「会员周报」「个性图标」「多彩主题色」等多个功能,一起来看看!

小宇宙PLUS会员,现已包含以下权益 ——

· AI播客总结
服务于播客重度用户的一些高信息密度节目场景。例如:你可以通过AI播客总结判断一期没有shownotes的节目是否值得听,也可以高效得到一期财经、商业、科技等领域节目的内容速报。更多使用场景,期待你的探索。

· 收藏时点
你可以通过「收藏时点」功能,随时标记最感兴趣的时点,记录此刻的私人笔记,并在【我的收藏】中查看汇总。即使正处于锁屏状态下也无需担心,iOS系统中,无需解锁也可以通过左下角的收藏按钮进行收藏时点的操作,一键收藏此刻的吉光片羽。

· 会员周报
每周一中午12:00左右,我们将为会员用户送上专属会员周报,并为你自动汇总并总结你可能错过的精彩节目,为你持续挖掘更多的兴趣内容。欢迎在【个人-会员入口】处进入查看。

· 个性图标与多彩主题色
看腻了你的小宇宙?成为小宇宙PLUS会员,即刻更换你的小宇宙图标和主题色,深空、毛绒、键帽、粉白、薄荷、深蓝……超多可选,让你的小宇宙与众不同。

当中第一项AI播客总结正好完美契合这个项目的功能,虽然我强烈怀疑这个会员是否真的值一年120元。因此我也在程序中加上了单集总结的功能。实现非常简单,通过发送提示词+播客转录稿实现。

计划中的功能列表:

  • 支持英文播客:加入英文提示词,并根据播客语言选择对应的提示词。
  • 切换embedding:现在使用的OpenAI text embedding的开销,对于个人用户来说不算很大,但也不小。需要切换到更便宜的版本或者本地推理的text embedding。目前计划使用MTEB榜单中排名较为靠前但显存需求不大的gte-Qwen2-1.5B-instruct
  • 一键运行所有任务:当前程序被分为不同的子程序,需要统一一个运行入口。
  • 新增播客总结:对于每次增量更新的内容进行小结。

以下是中文版的使用说明:

仓库地址https://github.com/liujinmarshall/podcast_rag

使用 RAG (检索增强生成) 技术来理解播客并提问

已测试 Python 版本:3.9 (应该也适用于更新的版本和不太旧的版本)

前提条件

  • Python 环境以及并了解如何运行 Python 程序
  • Google Gemini API 密钥和 OpenAI API 密钥

步骤

  1. 克隆此 Github 仓库;
  2. 创建一个名为 “data” 的目录;
  3. 将 podcasts.example.csv 复制到 data/podcasts.csv,并添加 RSS URL 条目;
  4. 通过 requirements.txt 安装 Python 依赖 (pip install -r requirments.txt);
  5. 将 Google Gemini API 密钥导出为 GEMINI_API_KEY,并将 OpenAI API 密钥导出为 OPENAI_API_KEY;
  6. 运行以下脚本以实现以下功能(使用 python xxx.py):
    1. download.py: 将播客音频媒体文件以增量模式下载到本地。每个播客一个目录。
    2. transcribe.py: 将音频媒体文件转录成文本。每个播客一个目录。
    3. index.py: 将转录文本分块并索引到向量数据库 (ChromaDB) 中。
    4. query.py: 启动一个聊天机器人来查询问题:
      • 运行程序;
        • 在浏览器中打开链接并开始提问 。
    5. summarize.py: 将转录文本总结成简洁的摘要。每个播客一个目录。
    6. delete_files.py: 删除音频媒体文件(超过 24 小时的文件),以防文件上传超出配额。上传超过 48 小时的文件将被自动清除

语言支持

  • 中文
  • 英语 (待添加)

注意

请遵守播客提供商的用户协议。此仓库仅供个人研究使用。

基于大模型的播客RAG系统搭建攻略(二):进阶之路与避坑指南

第一部分:https://onlymarshall.com/2025/01/05/build-personal-podcast-rag/

第三部分:https://onlymarshall.com/2025/01/26/build-personal-podcast-rag-part-3/

(注:本文在Gemini模型协助下完成。不得不感慨大模型很多时候思考的比人类周全,人类只要提供一些基本元素,大模型就可以把内容打磨地得非常完善)

上一篇我们介绍了播客搜索问答系统的基本架构和初步选型,特别是在语音转录方面的一些尝试和思考。今天我们继续深入,聊聊在系统搭建过程中遇到的更具体的技术挑战以及一些解决方案。

索引/检索的优化与挑战

上一篇我们提到索引和检索环节主要依赖文本向量模型和向量数据库。看似简单,但真正落地会遇到不少问题,尤其是在播客这种持续更新的内容源上。

增量更新:让知识库保持新鲜

播客的一大特点是持续更新。每周甚至每天都会有新的内容产生。如果每次更新都重新处理所有播客数据,那将是巨大的资源浪费。因此,增量更新是必须要考虑的。我们的目标是只处理新增的播客和更新的播客。这需要我们在“播客下载/爬虫”阶段做一些改进:

  • 记录已处理的播客和音频文件: 我们需要一个机制来记录哪些播客和对应的音频文件已经被处理过了。一个简单的做法是维护一个数据库(或者是简单的CSV文件),记录播客的feed URL以及每个episode的发布时间或唯一的GUID。
  • 对比更新时间或文件大小: 在爬取时,对于已经记录的播客,我们可以通过HEAD请求获取最新的episode信息,对比发布时间或GUID。对于新的episode,或者发布时间有更新的episode,再进行下载和后续处理。
  • 文件大小与HEAD请求的妙用: 除了对比发布时间,我们还可以利用HTTP HEAD请求来获取音频文件的大小。如果新爬取的音频文件大小与之前记录的不同,则说明文件可能被修改过,需要重新下载和处理。这对于一些播客会修改音频描述或者替换音频文件的情况很有用。HEAD请求相比于直接下载整个文件要高效得多,大大节省了网络资源。
  • 处理删除的播客: 有些播客可能会下架某集播客。我们需要定期检查已处理的播客列表,对比最新的feed内容,将已删除的播客集从向量数据库中移除,保持数据的一致性。
  • 保留时间:播客毕竟是音频文件,几百期的内容加起来也有几十个GB,如果总是保留所有的冷文件,特别是对于个人来说,存储的成本也没有必要。

有了以上这些功能,我们每天只要定时跑任务就可以自动完成对比、下载、转录、处理以及更新数据库的工作。

大模型转录的“后遗症”:重复文字问题

上一篇我们提到利用大模型的长上下文能力进行音频转录非常方便。但实际使用中,我们发现一个潜在的问题:重复文字和错误退出。

问题示例

尤其是在音频质量不高、语速较快或者多人对话的场景下,大模型有时会重复生成一些片段的文字。这可能是由于模型对音频的理解不够准确,或者在拼接长文本时出现偏差。

如何解决重复文字问题?

  • 检测错误并重新转录:这种情况有点像代码中因为并发造成的bug,而大模型运行本身也有一定的随机性,所以很大概率重新转录就可以解决这个问题。
  • 更精细的音频切分: 虽然我们避免了为了输入长度而进行的粗暴切分,但适当的、基于语义的切分仍然有必要。例如,可以根据静音段落或者明显的语意停顿进行切分,这样可以减少模型处理长音频的压力,降低重复的概率。
  • 后处理去重: 在得到转录文本后,可以进行一些后处理操作。例如,可以设定一个滑动窗口,如果窗口内的文本重复出现,则进行删除。当然,这需要谨慎操作,避免误删有效信息。
  • Prompt优化: 在给大模型下达转录指令时,可以加入一些提示,例如“请勿重复生成已出现过的文字”,虽然效果可能有限,但有时也能起到一定的作用。
  • 尝试不同的模型参数或模型: 不同的模型或者相同的模型在不同的参数设置下,表现可能会有差异。可以尝试调整解码策略或者使用更擅长处理此类问题的模型。

Text Embedding的中文选择:Gemini的踩坑

上一篇我们提到在文本向量模型上“跌了个跟头”。这里就来展开说说。

最初,我们可能自然而然地会选择一些通用的、在英文领域表现优秀的Embedding模型。既然Gemini也提供了文本Embedding,我们自然也选择这个模型。

但是在生成Embedding、存入数据库,再通过查询的Embedding进行检索之后,我发现了一个严重的问题:Gemini的文本模型似乎完全没办法理解中文

以下面的例子看,我们通过Gemini text-embedding-004模型,完全不同问题产生的embedding前10维完全一样。如果加上了一些英文字母的扰动,生成的结果就完全不一样。推测原因应该是tokenization的阶段把所有的非英文字符全部映射成了<UNK>,所以结果没有区别。

解决的方案也很简单:换成OpenAI的Embedding模型(text-embedding-3-small),因为使用了ChromaDB的代码,切换embedding function只要改动几行代码就可以实现。

后注:最终在某个文档页面发现了这个模型并不是多语言的版本,但似乎在GenAI embedContent的API里只能调用embedding-001和text-embedding-004,如果要调用多语言模型需要换到其他API。

Chunk大小的权衡

将长篇的转录文本切分成更小的chunk(块)是进行向量化的必要步骤。 Chunk的大小直接影响着检索的准确性和效率。

  • Chunk太小: 可能无法包含完整的语义信息,导致检索时丢失上下文,返回的结果不够相关。例如,一句关于“苹果公司新发布的手机”的信息被切分成“苹果公司”和“新发布的手机”两个chunk,单独检索“苹果公司”时,可能返回大量无关的结果。
  • Chunk太大: 虽然包含了更多的上下文,但会增加向量的计算成本和存储成本。同时,如果一个chunk内包含多个主题,可能会导致检索时返回与用户问题不太相关的部分。
  • Embedding模型限制:大部分embedding模型限制输入在几个K token左右,比如Gemini GenAI是输入上限2K,输出768维,OpenAI输入是8k,输出1536维

如何选择合适的Chunk大小?

这是一个需要根据实际播客内容和模型能力进行实验和调整的过程。一些可以参考的策略:

  • 基于句子或段落切分: 这是比较常用的方法,可以保证chunk的语义完整性。
  • 固定大小切分并加上重叠: 将文本按照固定token数量切分,并在相邻的chunk之间添加一定的重叠部分,以保留上下文信息。例如,一个chunk包含100个token,重叠20个token,那么下一个chunk从第81个token开始。
  • 利用语义切分工具: 一些工具可以根据语义相似性来切分文本,使得chunk内部的语义更加连贯。

在我们的实践中,我们尝试了不同的chunk大小,并结合向量检索的效果进行评估。 出于简单的考虑我们选择了固定大小切分并加上重叠。参数是2000个token一个chunk,重叠是200个token,通过tiktoken的包进行本地的计算(因为不知道embedding模型的tokenzier配置,所以这里只是近似)

小结

这篇博文我们深入探讨了播客RAG系统搭建过程中的一些关键技术点和挑战,包括增量更新、大模型转录的重复问题、中文Embedding模型的选择以及chunk大小的权衡。虽然已经有了大模型的加持可以很快编写核心骨架代码(大概降低了一半的时间),但是需求的不断迭代和看到结果后目标不停的调整,还是有相当大量的人为介入。编程门槛的降低,可以让非专业人士和专业人士摆脱一些低级的信息查找,把时间投入更有效率的地方。

后续我会整理一下代码之后发布开源(现在大部分都在notebook里)。

基于大模型的播客RAG系统搭建攻略(一):缘起,架构和选型

声明:本文仅介绍如何通过技术手段搭建系统,请遵守各个播客的用户协议。

第二部分:https://onlymarshall.com/2025/01/11/build-personal-podcast-rag-part-2/

第三部分:https://onlymarshall.com/2025/01/26/build-personal-podcast-rag-part-3/

缘起

开始听播客是在2016年初,那个时候刚拥有了人生第一辆车,也搬到了郊区自己的房子里,有比较固定的时间和空间。不知道是什么原因知道了在喜马拉雅上遇到了机核网的播客,那会儿已经开播了好几年,如获至宝,在两个月内把Gadio Pro栏目(特别是麦教授和四十二参与的)从第一期开始听完。之后随着机核的发展,转战机核App,直到2020年播客爆发,App也换成了小宇宙(意外发现就在五角场创智天地的前公司马路对面),形成了固定的收听习惯,订阅几十个中外栏目。

订阅的这些播客栏目,有些还是有相当的信息量。因为产品的音频形态,信息检索比较麻烦,有些播客即便刚刚听过,想回过头来找忘记或者漏掉的信息,也和很难定位到具体的时间点位重听。或者新接触一个播客,想知道以前聊过的内容里有没有自己感兴趣的话题可以快速加入收听列表。

架构

信息检索系统与搜索引擎

信息检索本质上可以分解成三个模块:

  • 下载/爬虫
  • 处理/索引
  • 检索/响应服务

传统的搜索引擎,这三部分对应了:

  • 爬虫系统:按照超链接把互联网的网页(文档)下载到本地
  • 索引系统:清洗数据,提取关键词,建立倒排索引(关键词->文档),索引更新
  • 检索系统:查询分析、排序结果文档

之所以要构建这三个系统,特别是爬虫和索引系统,主要原因在于整个互联网数据量太大,因此需要提前把文本内容下载并存储成检索友好的格式,这样用户通过关键词搜索就可以在几百毫秒之内得到结果。

Source: ByteByteGo https://blog.bytebytego.com/p/ep104-how-do-search-engines-work

RAG

随着大模型的出现,语义搜索也有了新的思路。这两年比较流行的方案是RAG(Retrieval Augementation Generation,检索增强生成,一个很拗口的名字)。我们也将采用这个方案。

RAG主要影响索引系统和检索系统,尤其是后者。传统的信息检索系统通过关键词匹配的方式搜索,直接把结果文档推给用户(再加上匹配到的关键词以及上下文高亮),但用户还需要自行处理加工。用户本质上是带着问题来的,比如“鸡蛋会增加胆固醇吗?”,“如何申请延迟提交报税表格”,关键词查询往往离最后的答案还有一定距离。

RAG利用大模型出色的语义处理能力,通过向量搜索(因为查询不再是关键词而是一个问题,传统的关键词查找加上倒排索引无法完成任务)查找到相关的文档,然后交给大模型去回答问题。RAG可以胜任语义搜索/问答的任务,但相对地使系统开销大大增加(10x),响应速度明显变慢(10x)。

来源:https://www.gptsecurity.info/2024/05/26/RAG/

播客搜索/问答架构

回到一开始的问题,我们搭建的系统也是由这几个模块组成:

  • 播客下载/爬虫:通过公开的RSS爬取播客音频和介绍信息;
  • 播客转录:把音频和介绍信息发送给语音到文字的引擎,变成文字稿,同时将文字稿分割处理向量化,放进向量数据库;
  • 播客搜索:搭建RAG系统,把问题转成向量进行向量搜索得到相关的文字稿,再把文字稿作为上下文和问题一起发送给大模型,得到最终回答并返回给用户。

选型

开发工具

最重要的开发工具是用来生成代码的大模型,这个年代做这种原型开发似乎已经没人从零开始写代码,尤其是还需要很多查找文档或者调试的工作。这次开发没有用很火的Cursor(舍不得花20刀月费)或者Github Copilot(公司有,但自己的设备也要花钱),而是体验阶段的Gemini 2.0 Flash Thinking Experimental搭配Google AI Studio。另外只是自己使用,暂时没有上线的需求,所以只在Jupyter Notebook里运行。

Google AI Studio写需求生成代码

语音转录

一开始想直接用OpenAI的whisper,价格如果嫌贵(一分钟$0.006刀,对应1集1个小时$0.36,100集要36刀也不是很便宜),也可以考虑本地host(但没有具体benchmark手头的4080可以跑多快)。主要的限制有两个:

  • 模型比较旧,处理prompt(比如时间轴,嘉宾识别)的能力不强;
  • 最大处理能力25MB,一个小时的音频大概是50~70MB,需要把音频切块。可以使用mp3lst等开源工具在段落切分(根据dB),但是不同音频的切分threshold可能不同,切分如果太细也会影响转录的精度。

前期工具调研在这一步卡了几天,后来想到可以直接用长上下文的大模型进行转录。尝试了市面上主流的几个模型以后,发现Google Gemini Flash 1.5非常合适:

  • 转录效果不错,可以基本正确生成时间轴,识别讲话的嘉宾;
  • 上下文窗口足够大,1M token可以容纳超过5个小时的音频(最大支持9.5小时);
    • 免费!免费档每天1500次配额,一集播客大概1-3次请求即可完成转录,转录一集大概3分钟完成,正好足够单线程处理);后面的收费档,一集一小时播客的成本大概$0.18(更正应为 $0.018,比官方价格贵因为上下文长且有好几次的对话),是whisper的一半(更正:应为5%),如果使用1.5 Flash 8B价格还能再减半(效果差点)。

解决了输入长度的问题,下一步卡在了输出这一步。为了避免单次请求占用过多的GPU资源,大部分模型的输出卡在了4k/8k,大概只够放半个小时的音频转录内容。难道又要回到音频切分的老路?其实解决办法很简单,在与大模型对话中继续提示:“请根据上面已经生成的内容继续生成转录文字稿。”,就会在上次停下的地方继续转录,直到完成所有的转录。这也是大模型编程神奇的地方:通过自然语言下发指令,而不是严格定义的编程规格/接口。

利用大模型的长上下文来做转录固然比较方便,但是这会导致需要下一次请求附带整个对话(之前转录的内容加上音频),成本直接翻N倍(如果是N次输出)。如果考虑成本的话,进行切分再拼起来是更好的选择。

索引/检索

这块没有特别的要求,基本上各厂商的文本对话大模型和文本向量模型就能满足需求。不过后面在文本向量模型上跌了个大跟头,后面的文章细说。

本地向量数据库选用了ChromaDB,直接让大模型替我做了选择。

附录:问问小宇宙

小宇宙官方也有类似的应用问问小宇宙,UI挺特别的,但是似乎产品一直没有迭代,召回也比较一般(似乎是基于每篇播客的AI总结做的,因此漏掉很多细节)。

An Incomplete Guide to the Bay Area Public Library System – Overview

(Note: This is a translation from riginal Chinese Edition 湾区公共图书馆系统不完全指南——概览篇 with the help from Google Gemini AI)

It was exactly ten years ago that I published “An Incomplete Guide to the Shanghai Library” (Parts-1, Part-2, and Part-3) on this blog. Having been in the Bay Area for a year now, visiting the library has become an important part of my daily life. On the one hand, I’m impressed by the abundance of resources, and on the other hand, I’ve also witnessed the various well-established usage systems, making me feel that the tax money was well spent.

P.S. There might be a chance to add a sequel to “An Incomplete Guide to the Shanghai Library” to record some of the new libraries I’ve visited in recent years (such as several suburban branches and the East Branch) and the significant changes.

System

What differs from the Shanghai library system I’m more familiar with is that the Bay Area library system embodies a more bottom-up, multi-level autonomy concept. This also fully reflects the differences in the political and economic systems between the two countries.

The Shanghai library system consists of three levels (municipal library, district library, and street/town library). Although it’s not a vertically managed system (I would guess the funding is also supported separately by each level of government), from the perspective of resources and allocation, the resources of the higher level are significantly better than the lower level. After several years of integration, Shanghai has basically incorporated all public libraries into one system, achieving a unified library card for borrowing from all levels of libraries across the city. This is quite convenient for readers, as you only need to register once to borrow from hundreds of branches throughout the city.

The introduction to the Bay Area libraries in this article is primarily focused on the South Bay and Peninsula areas, with the addition of online access to the San Francisco Public Library. Alameda in the East Bay restricts non-county residents from obtaining library cards. Firstly, these areas are not a single administrative region but rather three counties—Santa Clara, San Mateo, and San Francisco.

Within these three counties, SF and SC both have county-level (SF is both city and county) library systems with branches in various cities or neighborhoods. The SF library also has a main branch located in the city center.

SFPL Main Branch near SF Civic Center

Regarding the San Mateo County Library (SMCL), the situation is more complex. For example, while the libraries in this link are all within San Mateo County, they do not belong to the county library system. Generally, they are established independently by cities or neighborhoods.

The situation in Santa Clara County is the most complicated. First, the county-level library is the Santa Clara County Library District, SCCLD, which has branches in the following 8-9 cities. Among them, some major cities have built their own independent library systems, such as Sunnyvale, Santa Clara (City), Mountain View, Palo Alto, and Los Gatos.

Santa Clara县图书馆分散的馆址

Although San Jose is just one city, due to its large area and population, the scale of SJPL (San Jose Public Library) itself is even larger than the Santa Clara County Library, including 25 branches, with the Dr. Martin Luther King, Jr. Library as its main library. It is also shared with SJSU (San Jose State University). In terms of size, it’s not smaller than the main branch of SFPL (and the advantage of sharing with the university is that it opens very early, at 8 am; except for Sunday mornings, which are exclusively for students).

Dr. Martin Luther King, Jr Library in downtown San Jose is the main library of SJPL as well as library for SJSU

The advantage of the distributed branch system is that it increases the opportunity for the majority of people to access libraries, and books can circulate among these branches, greatly increasing the variety of books.

Many libraries are located near City Hall, Civic Center, or Community Center. If it’s not in a downtown area, there is usually free parking. The opening hours are also relatively friendly, usually open until 7-9 pm on weekdays and 5-6 pm on weekends. As they are established with public funds, entering and reading within these libraries doesn’t require any procedures, only a card is needed to borrow materials.

This article mainly introduces several major library systems in the Bay Area. The following articles will introduce library card registration, borrowing, searching, and e-library functions.

2024年终小结

时间转眼到了2024年底,今年的Blog写作数量一般,包括本文一共5篇。也给2025立个小OKR(需要很用力才能够到的目标)——一个月一篇,全年12篇,再过一年看看完成了百分之多少。

工作生活

在现在的公司度过了第7年,管理岗位的第5年。前几天突然想到我在现在的公司正好搜广推(搜索、推荐、广告)都做过,虽然搜索和广告不是核心的流量端,但这种遇不可求的机会,说不定哪天就来了。还没来得及盘点今年的工作,个人总体上马马虎虎,团队有小部分的亮点,但也有很多不足。经过一些招聘和离职,和团队的磨合也告一段落。相比于一开始的文化和管理挑战,开始习惯和适应当前的节奏。

缺憾:1)仍然没有找到一个有效的严格方法来度量各种模型的贡献;2)仍然没有对纯研究工作有独立贡献(但是可以提一些意见和想法)3)年初的一个想法,经多方推动,最后离上线老是差一点

收获:模型的推断有一些新的进步,包括LLM的推断优化和Ray的使用。没有放下一线的实践(比去年还多30%),抽空做做感兴趣的探索。

去过的地方

几次外出旅行——(西雅图一天一夜出差;单枪匹马自驾从北加到西雅图来回;春季和秋季趁着长周末分别刷了Kings Canyon和Sequoia National Park;南加感恩节家庭旅行)。

今年road trip是过足了瘾,把整个西海岸从北(Everett)到南(San Diego)走了个遍。

出差西雅图/Bellevue

到达西雅图机场
Bellevue我司所在的楼
匆匆回程

Sequoia红杉树国家公园

Memorial Day去的,人多车多,体验不是很好,很多时间在堵车等景区巴士找停车位,但是景色还是很不错的,前两张图是世界上最大的树(体积)——谢尔曼将军树。

自驾西雅图

老婆带着娃在六月中下旬回国探亲,难得偷闲的我在Juneteenth Day那周开始了蓄谋已接的road trip:

第一天:把家人们(这个词现在听上去怪怪的)送上飞机,从SFO出发到沿着101开到海边的Eureka小镇

第二天游览红木国家公园(Redwook National Park),晚上到达俄勒冈州首府波特兰。和水杉(Sequioa)相比,红杉(特别是海岸红杉)更高,而水杉体积更大。

市中心的Powell书店是世界上最大的独立书店

市区总体上还比较整洁,算是西海岸大城市里不错的

第三天是周一工作日,在几乎空无一人的公司波特兰Office里远程工作了一天,下班以后开赴西雅图(Bellevue)。波特兰办公室是见过我司最漂亮的,没有之一。而且一半以上的员工有独立的办公室(中间图,然而大家还是不太喜欢来)。晚上入住Airbnb,不同房间里住了不同的舍友。

Juneteenth Day公司放假,本来计划去Mount Rainier,连门票都预定好了,没想到一出门就碰到发动机故障灯,紧急联系了本地的dealer,虽然问题不大,也不用付钱,但Mount Rainier肯定是去不成了,中午和老同事吃了一顿饭,下午参观西雅图南郊的Museum of Flight和市中心随便走走。

西雅图市中心的水族馆和摩天轮,在《The Last of Us:Part 2》里来过。另外就是市中心的菜场和第一家星巴克。

周五休了一天假,首先预约参观波音总部Everett的工厂,可惜不能带任何的电子设备所以没有照片,拍的是Futer of Flight这个博物馆,包括工厂里停放的已经造好但还没取得适航证的777-9。

然后马不停蹄赶往Flying Heritage & Combat Armor Museum,是微软创始人保罗艾伦的个人军事收藏,都是真家伙(包括一辆切开的坦克),一点不比国家级别的博物馆差。

另外下午补了上次没参观完的Museum of Flight的室外展馆,第一次看到并登上了协和式的真机,空军一号(707版本)。晚上回到波特兰住宿,减少第二天赶路的里程。

周六从波特兰出发,游览火山口湖国家公园(Crater Lake National Park)。排队一个小时进山,山顶还都是大片的积雪,湖水异常湛蓝,非常震撼。晚上途径Mount Shasta山脚回到加州中央山谷最北边的Redding住宿,一下子从十多度的山顶到了39度的炙热。

Screenshot

最后一天,游览拉森火山国家公园(Lassen Vocalno National Park)。拉森火山上次大规模喷发还是在1914年,当年喷发的大石块还随处可见,山顶的高海拔还有大量积雪。

国王谷国家公园(King’s Canyon National Park)

某个周五趁着娃还没开学请了一天假去的,其实就在红杉树国家公园的隔壁,共用出入口。其中有世界上第三大的树——格兰特将军树。晚上打卡了Kingsman City的牛排馆,味道相当不错。

南加州/圣地亚哥感恩节之旅

继去年南加洛杉矶之旅,今年感恩节继续选择温暖的南加州,除了补上上次错过的衣阿华号战列舰,主要游览了圣地亚哥的几个主要景点。

震撼的三联装406mm主炮,仅次于大和号。

第一次摸到密集阵真家伙,人称R2D2

战斧巡航导弹的真家伙

继续军舰之旅——中途岛号航空母舰博物馆

第三天去了野生动物园,人生第一次坐了热气球。下午City Harbor Cruise,可惜风大还起雾,不过算第一次看到现役的航母卡尔文森号。

最后就是乐高乐园和海洋世界了

读过的书

今年大部分的Blog都是和书有关。

人在海外,看中文书主要通过:1)电子版;2)出差同事帮忙带;3)京东海外购。

《读库生鲜》是《读库》的青春版,内容相比《读库》主刊我更加喜欢(对于戏剧文学实在不太感兴趣。《读库》胜在电子版App,希望《读库生鲜》也能早日推出电子版)。

另外唯一看完的技术书是《Hands-on Large Language Model》,入门大模型深入浅出的好书,有大量的视觉化帮助理解。

现场体育比赛

MLB

沾了公司实习生的光,在公司的包厢里观看了MLB湾区德比——旧金山巨人队对战奥克兰竞技者(后者是《Moneyball》的主角球队,也是在湾区的最后一年)。

NBA

虽然只是季前赛,坐在最高的山顶,但是领到了库里的限量版美国队小金人!

有意思的事——开飞机!

花了200多美金带着娃(有点晕)体验了一下一个小时的塞斯纳172,包括起飞降落盘旋。希望明年可以真的开始学起来。费用在湾区大概要将近2w美金,大部分的费用是租赁飞机的价格(70小时*200美金/小时)。学飞行最大的障碍在我看来是通讯,嘈杂的环境,简练的术语,真的是怕听不懂。

2025展望

  • 一个月写一篇blog,并开始写作英文blog
  • 一个月看完一本书
  • 个人对生产系统有研究贡献
  • 继续在MLE方面有所实践
  • 能够出国一次;出差,旅游或者回国(取决于排期)
  • 看一场橄榄球和冰球,集齐美国四大体育的现场体验
  • Stretch:真的开始学开飞机

湾区公共图书馆系统不完全指南——概览篇

正好是十年前,我在这个博客里发表了《上海图书馆不完全指南》( )。到湾区一年来,拜访图书馆也日常生活中很重要的一部分。一方面感叹资源之丰富,同时也见识到了各种完善的使用制度,让人觉得这部分的税金没有白交。

另:《上海图书馆不完全指南》有机会也会再补充一个后续篇,记录一下后来几年的一些新拜访的场馆(比如几个郊区馆和东馆)和大的变化。

系统

和我比较熟悉的上海图书馆系统不一样的是,湾区图书馆系统更多体现了一个自下而上,多级自治的理念。这也完全反映了两个国家政治经济体制的差异。

上海的图书馆系统分为三级(市级馆、区级馆和街道/镇级馆),虽然并不是垂直管理(另外盲猜拨款应该也是有各级政府的分别支持),但是从资源和调度角度来看,上一级的资源是大大优于下一级的。经过几年的整合上海基本把所有的公共图书馆纳入了一个体系,实现了一卡通借全市各级馆,这一点对于读者来说相当方便,只要一次办证就可以在全市数百个分馆借阅。

本文对湾区图书馆的介绍基本仅限于南湾和半岛地区,加上线上访问旧金山图书馆。东湾的Alameda限制非本县居民办证。首先这些地方不是一个行政区域,而是三个县——Santa Clara, San Mateo和San Francisco。

这三个县当中,SF和SC都在县一级(SF是市县一体)建有图书馆系统并在一些city或者neigborhood设有分馆。SF图书馆另外在市中心有总馆。

SFPL在Civic Center旁边的总馆

对于San Mateo县图书馆(SMCL),情况复杂一些。比如这个链接里的图书馆虽然都在San Mateo县内,但是不属于县图书馆系统,一般都是由city或者neighborhood自己设立。

Santa Clara县的情况最为复杂。首先,县一级的图书馆是Santa Clara County Library District, SCCLD,在下面8-9个city设有分馆。当中有一些主要的city自己建设了独立的图书馆系统,比如大家比较熟悉的Sunnyvale, Santa Clara (City), Mountain View, Palo Alto和Los Gatos等等。

Santa Clara县图书馆分散的馆址

San Jose虽然只是一个市,但是由于面积大人口多,SJPL(San Jose Public Library)本身的规模甚至超过了Santa Clara County Library,包括了25个分馆,其中作为主馆的Dr. Martin Luther King, Jr. 图书馆还是和SJSU(圣何塞州立大学)共享,规模上不比SFPL的总馆规模小(而且和大学共享的优点是开门时间很早,早上8点;除了周日早上是学生独享时间)。

圣何塞市区的马丁路德金图书馆既是SJPL的主馆,也是SJSU的图书馆

分散馆址系统的好处是可以让大多数人接触图书馆的机会增加,而书籍可以在这些分馆里流通,大大增加了书籍的品类。

很多图书馆就设立在City Hall, Civic Center, Community Center附近,如果不是城区的话一般也会有免费停车场。开放时间也比较友好,平日开放到晚上7-9点,周末一般是5-6点。由于是通过公共资金设立,所以这些图书馆的进出和阅览都不需要任何手续,只有外借资料才需要办理证件。

本文主要介绍湾区的几个主要图书馆系统。接下来会分几篇文章介绍图书馆的办证、借阅、查找,以及电子图书馆功能。

The Bomber Mafia

刚看完Gladwell的”The Bomber Mafia”(中文译名《正战争与沉迷》,略有点莫名其妙)。二战前美国陆军航空队有部分专家精英痴心于精准轰炸,即通过准确打击敌方命脉(比如轴承厂),以达到瘫痪敌方的目的,人称“轰炸机黑手党”(六七十年代又出现了战斗机黑手党)。

特别是后来出现的诺顿投弹瞄准器,让轰炸机通过在高空输入各种参数(风向、高度、湿度、温度等)即完成万米投弹,而不必冒着对方防空火力承受大量损失。在此之前精准轰炸只能通过低空地方才有可能。轰炸机黑手党认为这样可以以双方最小的代价结束战争,而不需要牵扯到大量士兵厮杀和后方的平民损失。

在欧洲战场,轰炸机黑手党出师不利。一方面由于英国方面坚持使用夜间区域轰炸,另一方面投弹瞄准器的精度也不太够,只取得了不大的战果。而后在太平洋战场,美军占领了马里亚纳群岛以及B-29的服役,轰炸日本本土的大幕即将拉开,这也是轰炸机黑手党的又一次证明自己的机会。

在日本战场,轰炸机黑手党碰到的另外一个问题是高空气流导致精度无法保证。在几次战果寥寥的出击之后,黑手党代表人物汉塞尔被撤,换上了后来大名鼎鼎的李梅。这个时候正好碰上了凝固汽油弹(napalm)的诞生,日本本土的苦日子也开始了。

凝固汽油弹本质是胶状,液态汽油泼洒在固体表面难以附着持续燃烧,而凝固汽油可粘在目标上并产生上千度的高温,因此对物体和人员有强烈的杀伤。 李梅上任后改变战术,低空夜间区域轰炸,造成大量人员特别是平民的伤亡(最大的行动在一夜间造成10万人以上死亡,超过原子弹),具体可参考《天火焚魔》。

最后从战术战果上看,区域轰炸取得了胜利,但作者也对轰炸机黑手党也进行了高度褒扬。书中提到汉塞尔很喜欢《堂吉柯德》,他本身也是一个堂吉柯德式的人物,创新、敢于尝试和执着。李梅赢得了战斗,但汉塞尔赢得了战争。