被LangChain折磨够了吗?试下100行代码打造的LLM有向图框架PocketFlow | 独家最新
你是否曾对着一个繁复的AI框架,无奈地想:"真有必要搞得这么复杂吗?"在与臃肿框架斗争一年后,Zachary Huang博士决定大刀阔斧地革新,剔除所有花里胡哨的部分。于是Pocket Flow诞生了——一个仅有100行代码的超轻量级大语言模型框架!本文帮你彻底打通Pocket Flow+.cursorrules.file的最前沿用法。Zachary Huang博士用100行代码证明:真正的技术突破源于本质洞察,而非堆砌抽象。
https://github.com/The-Pocket/PocketFlow
现有的大语言模型框架实在太臃肿了!
过去一年,许多开发者一直在使用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决定回归本质,探寻更加简洁有效的解决方案。
经过一年从零开始打磨大语言应用的经验,Zachary得出了一个关键洞见:所有复杂性的背后,大语言系统本质上不过是一个简单的有向图!基于这一发现,PocketFlow应运而生——一个零臃肿、零依赖、零供应商锁定的框架,全部代码仅有100行!
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) 。就这么简单!没有华丽辞藻,没有复杂架构——只有能组合成强大系统的简单积木!
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这样能搜索网络并回答问题的工具。
流程设计:简单明了的流程图就够了
这是智能体行为的简单流程图:
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
design
未来展望:智能体编码?人机协作的最高境界!
PocketFlow的真正魅力远超其极简设计。最具革命性的是它开启了智能体编码 (https://zacharyhuang.substack.com/p/agentic-coding-the-most-fun-way-to) 的大门——一种全新的编程方式,让AI助手帮你构建和改进AI应用!
智能体编码说白了就是与AI一起写代码的实践。打个比方,就像盖房子——开发者是有远见和专业知识的建筑师,而AI则是负责具体施工的建筑队:
- 你是建筑师:提供愿景和关键决策 (人类擅长的事)
- AI是建筑队:处理所有细节实现 (AI擅长的活)
- 你负责验收:审查和完善最终成果
这种协作能让生产力提升10倍!开发者少写重复代码,多做创造性思考!
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助手将自然而然地掌握这些原则,让大语言应用开发真正畅通无阻!
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”。
全部评论
留言在赶来的路上...
发表评论