
第五章:文本聚类与主题建模(Text Clustering and Topic Modeling)
继续巩固 LLM 的基础知识,文本聚类与主题建模是 NLP 中的两个概念,文本聚类就是文本按语义分类,如猫狗一块,苹果西瓜在一起,足球篮球放一堆, 而它们的分类名就是主题了,如动物,水果,体育。主题范围有大有小,水果可以延展到食物,体育可以缩小到球类,语义越相近,就离得越近,这其实就是物以类聚。
可用嵌入模型进行聚类,与文本聚类相关的主题建模方法是 BERTopic. 下面是用 Hugging Face 上的
arxiv_nlp数据集来进行本章的学习,Hugging Face 还真是一个宝藏啊,估计一些禁书都能在里面找到。arxiv_nlp包含了 1991 年到 2024 年来自 ArXiv cs.CL(计算与语言)板块 44949 篇摘要。1from datasets import load_dataset 2dataset = load_dataset("maartengr/arxiv_nlp")得到的 dataset 是
Read More
第四章:文本分类
文本分类(Text Classification) 是 NLP 中常见的任务之一,如不同语义的分类,动物,植物; 肉类,还是水果,蔬菜,开心还是悲伤,或业务分类等。 表示模型和生成模型在文本分类中的作用不容忽视。
下面是用预训练模型对 Hugging Face 上的电影评论数据集
rotten_tomatoes进行文本分类的测试。1from datasets import load_dataset 2data = load_dataset("rotten_tomatoes") 3print(data)里面包含三部分的数据
train训练集,validation验证集,test测试集。我们将用训练集训练模型,使用测试集来验证结果, 附加的验证集用来验证模型的泛化能力。rotten_tomatoes中记录有两个字段,分别为text: 电影评论文本label: 电影评论的标签,0 代表负面评论,1 代表正面评论。

前面差不多历经了 LangChain 学习和组件的以下底,中, 高三个阶段
- 底层的 LangGraph 的 GraphState, 是 LangChain 的基石,做一个 AI Agent 的内部表现形式就是一个状态图
- LangChain 的
init_chat_model(), Prompt Engineering, 用于一次性的与模型的对话,想要实现短长期记忆,工具调用,实现起来很麻烦,就得前进到下一层 - LangChain 的
create_agent(), Context Engineering, 有了开箱即用的短长期记忆,自动的工具调用,Human-in-the-loop, 并且也可以实现多 Agent - DeepAgents 的
create_deep_agent(), Harness Engineering, 要做一个完备功能的 Agent 就得靠它了,它自动提供了像计划,自动管理上下文 支持 Skills, 内置工具,需要处理复杂任务时自动启动子 Agent
下面就来探索一下它的内置的功能, 先分析一个最简单的例子看看背后发生了什么
依赖安装:
uv add deepagents langchain-ollama
Read Moredeepagents会连带安装langchain,langchain-anthropic,langchain-google-genai和wcmatch。langchain会安装它的传递依赖,像langchain-core,langgraph之类。langchain-ollama用来使用本地Ollama模型的。
第三章:LLM 的内部机制
这一章才是本书的最重要的部分,一个支撑现在大语言模型的基石,那就是 Transformer 模型, 占据了本书约 12% 的篇幅。学完分词与词嵌入后,现在开始探究 Transformer 模型的工作原理。我们把
Transformer LLM看成是一个接收文本输入并生成响应的系统, 模型总是在预测下一个 Token, 每个 Token 的生成都是模型的一次前向传播(forward pass). 在生成当前 Token 后,会将该生成的 Token 追加到输入序列中,作为下一次预测的输入( 或者说调整下次生成的提示词), 如此循环往复,逐个生成 Token,直到完成整段响应——这种机制称为自回归(autoregressive) 生成。这种使用生成的前一个 Token 又作为输入来生成下一个 Token 的模型被称为自回归模型(autoregressive model)。而 BERT 是双向(Bidirectional)编码模型。
前向传播的组成, 分词器后就是由
Read MoreTransformer堆叠而成的神经网络,最后是一个 LM head, 它负责将 Transformer 块的输出转换为 Token 的概率分数。
第一章:大语言模型简介
应该还是在前年读了 《Build a Large Language Model (From Scratch)》前面一小部分,就中断了, 如今又找来一本相关的书籍 《Hands-On Large Language Models》试着啃一啃,能明白多少是多少。拿着中英文的两个版本对照着看,有些中文翻译最好还是不译的好。 这里只会一些杂乱的笔记,算不得什么记要,重要的信息仍然在书上。
学习中相关的测试代码放在 GitHub 仓库 yabqiu/Hands-On-Large-Language-Models, 主要是在 macOS 苹果芯片上进行的测试。虽然官方有一个相应的仓库 HandsOnLLM/Hands-On-Large-Language-Models, 但作为沉浸式学习,亲自根据自己的口味撸一遍代码是非常必要的,所以也会发现我学习时的代码与书中不完全相同。
文字的计算机语义处理有过
Bag-of-words,word2vec,sequence-to-sequence, 再就是BERT,GPT这些概念了。 写作 "Attention Is All You Need" 这篇论文的作者们真是太伟大了,拿不到诺贝尔奖,也应该给他们个图灵奖,虽然其中的技术并非很高级, 但这篇论文在AI发展史中绝对有着里程碑式的意义。模型从大的功能分为
- 仅编码的表示模型(representation model),如种种嵌入模型,都比较小的,约几百兆大小, 像 BERT(bidirectional encoder representations from Transformers)
- 生成模型(generative model), 关注生成文本, 通常不会被训练用于生成嵌入, 像 GPT(Generative Pre-trained Transformer)

在往
Deep Agents的路径还要继续啃下一些基础知识,其中之一就是多 Agent 协作(Multi-agent)。复杂的系统需要多个Agent(智能体)同共完成, 不那么复杂的系统可以用动态的Prompt,Tool, 或Model来切换。多 Agent 的好处是每个 Agent 有自己的上下文,工具,专业领域的知识, 可以独立开发,分布式部署,多个 Agent 能并行执行,加速工作与烧钱的速度。LangChain在构建多 Agent 系统时,有以下几种常见模式:- Subagents(子 Agent): 主从 Agent 方式,子 Agent 作为主 Agent 的工具使用,由主 Agent 指挥子 Agent 干活
- Handoffs(任务交接): 任务可转交给(以 Tool 方式)其他 Agent,其他 Agent 的结果可直接返回给用户,
hand off就是传球的意思 - Skills(技能): 动态加载特定的 Prompt 和知识,用单一
Agent控制按需加载技能,本质上它是单 Agent - Router(路由):由一个路径控制任务如何分配给不同的 Agent,结果汇集成一个组合的响应
- Custom workflow(自定义工作流):用更底层的
LangGraph定制工作流程,以上模型均可嵌入到工作流中
下面贴上每种类型的组件和时序图(顺便给自己的 Hugo 加上
Read Moretabs标签页功能,以方便对比切换和节约滚动条)
一接触
LangChain就有种停不下来的感觉,在Deep Agents与底层的LangGraph之间,还是想把LangChain的核心组件搞明白一些, 本文是学习Streaming的笔记。Streaming给人的第一印象就是用ChatGPT聊天时机器回复时是一个字一个字蹦出来的,因为这就是LLM的思维方式,不断的预测下一个 Token.有个疑问: 这种预测下一个 Token 方式, 中国产的
LLM放到Ollama中运行是怎么实现的过滤敏感词的呢?前端一个字一个字蹦出来的效果反应到后台 API 响应(以 Ollama 为例)格式是
Content-Type为application/x-ndjson,这种格式是Newline Delimited JSON,即每行是一个 JSON 对象,以\n分隔,Transfer-Encoding为chunked,表示数据是以分块传输的,所以客户端只要一个个Chunk的输出就是那种效果了。从
LLM的那种流式(Chunk)输出也能体会出Markdown在逐字显示内容时的优势,自上而下,自然而然的清晰结构。下面是
Read MoreLangChain中使用ChatOllama模型时,服务端响应数据的片断:
Prompt, Context, Function Calling (Tools), MCP, Agent Skills, Harness, Vibe Coding, 随着 AI 新名词不断的涌现, 对 Tools, MCP 应该比较熟悉了,为了避免自己更早的变成
同事.skill,将参考 LangChain 官方的实战 Build a SQL assistant with on-demand skills 来学习来理解什么是Agent Skills以及它的工作原理。在刚听到
Agent Skills这个概念的时候,对它的模糊理解是参考 Tools 是本地工具,MCP 是远程工具,它们都是在Prompt中把工具的名称,描述, 以及参数列表发给了模型,模型会按需通知Agent调用相应的工具(本地 Tool 或远程 MCP Tool);Agent Skills大约是在Prompt只包含每个Skill的名称与描述,模型会进一步按需加载相应Skill中的工具,然后指导Agent调用这些工具。Agent Skills即按需加载的工具,无需在 一个Prompt中包含所有工具的Schema.下面通过参考 'Build a SQL assistant with on-demand skills' 并实践来验证上面的初步猜想。
Read More
LangChain的长期记忆可以在创建Agent时指定store参数,如create_agent(store=InMemoryStore()), 但它只是把Agent与store关联了起来,仅此而已,要让长期记忆生效的话必须选择适当的时机,用Middleware或Tool手动的对store进行get(),put,search()等操作。而短期记忆则不同,只要create_agent(checkpointer=InMemorySaver())就让Agent具有了短期记忆能力。在使用
store的时候,无论是使用InMemoryStore还是PostgreSQLStore等,历史会话的保存与召回还有很多讲究的地方,例如哪些消息需要保存, 消息如何保存(是否要向量化),新旧消息如何处理等。Mem0 是一个为 AI Agent 提供长期记忆能力的开源框架,它的核心思路是利用大语言模型(LLM)把对话内容转化为结构化的
Read More事实存入向量数据库,并通过LLM动态维护这些事实的增删改。Mem0在存入时会不存入原文,而是用LLM抽取事实,更新时能与旧记忆合并,删除矛盾记忆, 记忆查询也是把文本转换成向量后进行相似度匹配。向量检索擅长语义模糊匹配,关系推理时 Mem0 1.1 之后引入了图记忆(如用 Neo4j 图数据库)作为补充。 提供 MCP 协议支持不同 AI 应用间的记忆共享与互通。
经历了一番
LangChain的学习之后,现在能更好的理解LangGraph,LangChain以及Deep Agents之间的关系了LangGraph: 是该家族的底层实现,代表是StateGraphLangChain: 1.0 后不再是Chain,而是Graph, 代表是init_chat_model()和create_agent(), 前者与模型完成单次请求/响应,
后者能与模型进行完整会话,包括工具的自动调用Deep Agents: 是LangChain的高级应用,代表是create_deep_agent(), 在create_agent()之上还能进行自动的规划
学习过一些基本的和高级概念, 如
Agents,Models,Shot-term memory,MCP,Human-in-the-loop, 以及Long-term memory之后,
再一次回到Agent与模型交互的原点上来,即Messages. 我们将学习两个层面的消息表示:Agent与模型交互时Python层面的消息表示,LangChain与模型无关的消息格式Agent与模型交互时HTTP协议交互层面的请求/响应消息
本文依然以本地
Read MoreOllama模型/服务为例,HTTP响应数据都是一个个Chunk, 每个Chunk是一个JSON对象,包含一两个Token, 我们会直接提取整个响应的Token数据,同时会关掉Reasoning(不希望产生Thinking的响应)。