被LangChain折磨够了吗?试下100行代码打造的LLM有向图框架PocketFlow | 独家最新

你是否曾对着一个繁复的AI框架,无奈地想:"真有必要搞得这么复杂吗?"在与臃肿框架斗争一年后,Zachary Huang博士决定大刀阔斧地革新,剔除所有花里胡哨的部分。于是Pocket Flow诞生了——一个仅有100行代码的超轻量级大语言模型框架!本文帮你彻底打通Pocket Flow+.cursorrules.file的最前沿用法。Zachary Huang博士用100行代码证明:真正的技术突破源于本质洞察,而非堆砌抽象。


https://github.com/The-Pocket/PocketFlow


被LangChain折磨够了吗?试下100行代码打造的LLM有向图框架PocketFlow - 独家最新  第1张


被LangChain折磨够了吗?试下100行代码打造的LLM有向图框架PocketFlow - 独家最新  第2张


现有的大语言模型框架实在太臃肿了!


过去一年,许多开发者一直在使用LangChain这类热门框架构建AI应用。这种体验简直令人抓狂:


  • 臃肿的抽象层 - Octomind工程团队一针见血地指出 (https://www.octomind.dev/blog/why-we-no-longer-use-langchain-for-building-our-ai-agents):"LangChain最初确实很有用,但它那些高级抽象很快就让我们的代码变得晦涩难懂,维护起来简直是噩梦。"这些框架把本该简单的功能隐藏在一堆不必要的复杂性之后!
  • 开发者噩梦 - 这些框架不仅抽象复杂,还让开发者背负了依赖包臃肿、版本冲突和接口频繁变动等诸多问题。开发者们经常吐槽 (https://www.reddit.com/r/LangChain/comments/1j1gb88/why_are_developers_moving_away_from_langchain/):"太不稳定了,接口总在变,文档永远跟不上进度。"甚至有人调侃道:"你读完这句话的功夫,langchain已经悄悄弃用了4个类,而且文档压根没更新。"


这不禁让人思考:我们真的需要这么多层复杂的封装吗?如果把所有冗余的部分都去掉会怎样?真正简洁实用的方案到底是什么?


PocketFlow:核心抽象仅需100行代码!


PocketFlow的创建者Zachary Huang是一位即将从哥伦比亚大学计算机博士毕业的研究者,曾在Microsoft Gray Systems Lab和Databricks实习,凭借杰出研究赢得谷歌奖学金,即将加入微软研究院担任研究员继续大语言模型智能体的开发工作。Zachary在实际开发大语言模型应用的过程中,深切体会到现有框架的种种问题。这些框架虽然功能丰富,但过度复杂的设计给开发者带来了沉重负担。于是,Zachary决定回归本质,探寻更加简洁有效的解决方案。


被LangChain折磨够了吗?试下100行代码打造的LLM有向图框架PocketFlow - 独家最新  第3张


经过一年从零开始打磨大语言应用的经验,Zachary得出了一个关键洞见:所有复杂性的背后,大语言系统本质上不过是一个简单的有向图!基于这一发现,PocketFlow应运而生——一个零臃肿、零依赖、零供应商锁定的框架,全部代码仅有100行!


被LangChain折磨够了吗?试下100行代码打造的LLM有向图框架PocketFlow - 独家最新  第4张

comparison


极简构建块


PocketFlow最核心的就是三个极简构建块。可以想象成一个井井有条的厨房:


  • 节点就像各个烹饪工位 (切菜区、炒菜区、装盘区) :class BaseNode:


def__init__(self):

self.params,self.successors={},{}

defadd_successor(self,node,action="default"): self.successors[action]=node;return node

defprep(self,shared): pass

defexec(self,prep_res): pass

defpost(self,shared,prep_res,exec_res): pass

defrun(self,shared): p=self.prep(shared);e=self.exec(p);returnself.post(shared,p,e)


  • 流程就是告诉你下一步该去哪个工位的菜谱:


class Flow(BaseNode):

def__init__(self,start): super().__init__();self.start=start

defget_next_node(self,curr,action):

return nxt=curr.successors.get(action or"default")

deforch(self,shared,params=None):

curr,p=copy.copy(self.start),(params or {**self.params})

while curr: curr.set_params(p);c=curr.run(shared);curr=copy.copy(self.get_next_node(curr,c))

defrun(self,shared): pr=self.prep(shared);self.orch(shared);returnself.post(shared,pr,None)


  • 共享存储就是所有工位都能取用食材的中央台面。在实际实现中,共享存储通常是内存中的Python字典,或者是数据库连接器:


load_data_node = LoadDataNode()

summarize_node = SummarizeNode()

load_data_node >> summarize_node

flow = Flow(start=load_data)


shared = {"file_name": "data.txt"}

flow.run(shared)


在这个高效厨房系统中:


1. 每个工位 (节点) 只做三件简单的事:

  • 准备 (prep) :从中央台面 (shared) 取用所需食材
  • 执行 (exec) :专注完成自己的任务
  • 收尾 (post) :把成果放回中央台面 (shared) 并告知下一站

2. 菜谱 (流程) 根据情况智能引导 (orch) :

  • "蔬菜切好了?去炒菜区!"
  • "菜炒熟了?去装盘区!"


PocketFlow还支持批处理 (Batch) 、异步执行 (Asynchronous) 和并行处理 (Parallel) 。就这么简单!没有华丽辞藻,没有复杂架构——只有能组合成强大系统的简单积木!


被LangChain折磨够了吗?试下100行代码打造的LLM有向图框架PocketFlow - 独家最新  第5张

abstraction


那OpenAI的API封装呢?


与其他框架不同,PocketFlow刻意避开特定供应商API的绑定。为什么?


  • 零依赖烦恼 - 当前大语言框架动辄就带来几百兆的依赖包。PocketFlow保持零依赖,项目轻盈灵活!
  • 零供应商锁定 - 想用OpenLLaMA等本地模型?随时可以,无需改动核心架构!
  • 完全掌控自由 - 需要提示缓存、批处理或流式处理?直接按需构建,不必与预设抽象较劲!


开发时需要OpenAI API封装?让ChatGPT给你写一个!通常只需10行代码。这比预设的僵化封装灵活多了!


def call_llm(prompt):

from openai import OpenAI

client = OpenAI(api_key="YOUR_API_KEY_HERE")

r = client.chat.completions.create(

model="gpt-4o", messages=[{"role": "user", "content": prompt}]

)

return r.choices[0].message.content


# Example usage

call_llm("Hello World!")


有了这些精简又强大的构建块,开发者可以轻松搭建复杂的智能体 (Agent) 、检索增强生成系统 (RAG) 和大语言工作流 (Workflow) ,完全掌控每个环节。来看个例子!


实战:10分钟搭建一个网络搜索智能体!


我们用PocketFlow来构建一个网络搜索智能体,类似Perplexity AI这样能搜索网络并回答问题的工具。


流程设计:简单明了的流程图就够了


这是智能体行为的简单流程图:


被LangChain折磨够了吗?试下100行代码打造的LLM有向图框架PocketFlow - 独家最新  第6张

flow


# Create instances of each node

decide = DecideAction()

search = SearchWeb()

answer = AnswerQuestion()


# Connect the nodes

# If DecideAction returns "search", go to SearchWeb

decide - "search" >> search


# If DecideAction returns "answer", go to AnswerQuestion

decide - "answer" >> answer


# After SearchWeb completes and returns "decide", go back to DecideAction

search - "decide" >> decide


# Create and return the flow, starting with the DecideAction node

return Flow(start=decide)


每个节点干啥?超简单:


1. DecideAction"搜索还是回答?"

  • 准备 (prep) :读取用户问题和已有搜索结果
  • 执行 (exec) :让大语言模型判断是该搜索还是直接回答
  • 收尾 (post) :返回"search""answer"指令

2. SearchWeb"找点新信息!"

  • 准备 (prep) :获取搜索关键词
  • 执行 (exec) :调用搜索API获取结果
  • 收尾 (post) :保存结果并返回给决策节点

3. AnswerQuestion"信息够了,回答问题!"

  • 准备 (prep) :整合问题和所有搜索内容
  • 执行 (exec) :让大语言模型生成有用的回答
  • 收尾 (post) :保存回答并结束任务


这个流程图灵活透明又易扩展!想换搜索引擎、使用不同的大语言模型或添加新决策点?分分钟搞定,不会动摇核心逻辑!


实际运行一个例子


假设用户问:"谁赢了2023年超级碗?"来看看流程怎么走:


1. DecideAction处理

  • 检查 (prep) :问题内容 (还没有信息)
  • 判断 (exec) :"不知道2023超级碗结果,需要搜索一下"
  • 行动 (post) :生成搜索关键词"2023年超级碗冠军"
  • 转向 (orch) :SearchWeb节点

2. SearchWeb处理

  • 接收 (prep) :搜索"2023年超级碗冠军"
  • 执行 (exec) :搜索网络 (找到"堪萨斯城酋长队赢了")
  • 保存 (post) :搜索结果
  • 返回 (orch) :回到DecideAction

3. DecideAction再次处理

  • 检查 (prep) :问题+搜索结果
  • 判断 (exec) :"已有足够信息可以回答了"
  • 行动 (post) :决定现在可以回答
  • 转向 (orch) :AnswerQuestion节点

4. AnswerQuestion处理

  • 整合 (prep) :问题和所有搜集到的信息
  • 生成 (exec) :友好清晰的回答
  • 完成 (post) :任务结束!


就是这么简单高效!整个智能体实现只需几百行代码,建立在100行框架基础上。可组合的节点和简单的流程图就能创建智能、高效的AI系统。没有黑科技,没有框架冗余,只有清晰的逻辑和完全的掌控权!想自己试试?查看完整示例代码:https://github.com/The-Pocket/PocketFlow/tree/main/cookbook/pocketflow-agent


不止于搜索智能体,还能搭建更多强大应用!


PocketFlow远不止于搜索智能体。开发者可以搭建各种应用:多智能体系统 (multi agents) 、工作流自动化 (workflow) 、检索增强生成系统 (RAG) 、映射归约处理 (map-reduce) 、流式数据处理 (streaming) 、监督控制系统 (supervisor) 、聊天记忆管理 (chat memory) 、模型上下文协议 (model context protocol) 等等。


每个实现都遵循相同模式:从基本原则出发,简洁而强大。不必啃几十万行代码,PocketFlow让你从基础开始构建自己的理解。查看完整教程和示例:https://github.com/The-Pocket/PocketFlow/tree/main/cookbook


被LangChain折磨够了吗?试下100行代码打造的LLM有向图框架PocketFlow - 独家最新  第7张

design


未来展望:智能体编码?人机协作的最高境界!


PocketFlow的真正魅力远超其极简设计。最具革命性的是它开启了智能体编码 (https://zacharyhuang.substack.com/p/agentic-coding-the-most-fun-way-to) 的大门——一种全新的编程方式,让AI助手帮你构建和改进AI应用!


智能体编码说白了就是与AI一起写代码的实践。打个比方,就像盖房子——开发者是有远见和专业知识的建筑师,而AI则是负责具体施工的建筑队:


  • 你是建筑师:提供愿景和关键决策 (人类擅长的事)
  • AI是建筑队:处理所有细节实现 (AI擅长的活)
  • 你负责验收:审查和完善最终成果


这种协作能让生产力提升10倍!开发者少写重复代码,多做创造性思考!


被LangChain折磨够了吗?试下100行代码打造的LLM有向图框架PocketFlow - 独家最新  第8张

agentic


如何教AI构建强大的大语言模型应用?


传统框架的困境:代码膨胀,文档匮乏 以前的框架思路完全走偏了——它们在代码中硬编码各种特定应用的封装:


  • 代码膨胀:智能体 (langchain.agents) 、检索增强生成 (langchain.retrievers) 、记忆管理 (langchain.memory) 等功能都被固化在代码库中,导致代码库膨胀到几十万行,依赖关系复杂
  • 文档滞后:核心功能在代码中,文档往往简短、过时且晦涩难懂


PocketFlow革命:文档即第二代码库! Pocket Flow的解决方案颠覆了传统思维。与其将功能固化在代码中,不如让它灵活存在于文档中:


  • 极简核心代码:仅保持100行,只保留核心构建块,永远不会膨胀
  • 丰富文档生态:将丰富的功能实现方法和应用场景详细阐述在几千行的文档中,而非固化在代码库里


AI辅助开发的未来:文档直接指导AI (.cursorrules)


这些文档不仅仅是给人类看的参考资料,更是AI助手的"指导手册"。通过将文档转化为AI助手的规则文件,如.cursorrules (https://github.com/The-Pocket/PocketFlow/blob/main/.cursorrules),Cursor等智能工具能够快速掌握PocketFlow的设计理念,在对话中灵活应用其设计模式。开发者只需专注于系统架构设计,学习少量基础构建块,就能让AI助手针对特定需求生成完美契合的解决方案,而不必被繁琐的框架限制所困扰。


更令人振奋的是:随着Pocket Flow代码的广泛传播,它们最终会进入未来大语言模型的训练数据。到那时,甚至不需要明确的文档,AI助手将自然而然地掌握这些原则,让大语言应用开发真正畅通无阻!


被LangChain折磨够了吗?试下100行代码打造的LLM有向图框架PocketFlow - 独家最新  第9张

cursor


返璞归真,掌控未来


PocketFlow颠覆了"更复杂才更强大"的传统思维,用100行代码证明:真正的技术突破源于本质洞察,而非堆砌抽象。通过将大语言应用简化为基础有向图,它不仅让开发者摆脱了框架束缚,更为人机协作的智能体编码时代奠定了基础。


简洁并不意味着能力有限,恰恰相反,它赋予了开发者最大的自由和掌控力。正如伟大设计常常遵循的原则:"不是无法再添加,而是无法再简化时,才达到完美。"


别忘记给项目点亮Star,以感谢Zachary Huang博士为AI进步所做出的卓越贡献!


立即体验PocketFlow,感受100行代码如何取代成千上万行!

GitHub仓库:https://github.com/the-pocket/PocketFlow

文档: https://the-pocket.github.io/PocketFlow

TypeScript版本: https://github.com/The-Pocket/PocketFlow-Typescript


文章来自于“AI修猫Prompt”,作者“AI修猫Prompt”。


被LangChain折磨够了吗?试下100行代码打造的LLM有向图框架PocketFlow - 独家最新  第10张