LangGraph PostgreSQL持久化检查点:解决Agent状态丢失,实现生产级工作流
1. 从“健忘”到“持久”为什么LangGraph需要检查点如果你玩过LangGraph尤其是用它构建过一些需要多轮交互的复杂Agent工作流大概率会遇到一个头疼的问题程序一重启Agent的“记忆”就清零了。比如你正在和一个客服Agent对话聊到一半服务器更新重启了或者你本地调试时中断了脚本再启动时Agent完全不记得刚才聊了什么用户得从头再说一遍。这种体验无疑是灾难性的。这背后的核心原因在于LangGraph默认将工作流的运行状态我们称之为“状态机”保存在内存中。内存速度快但有个致命缺点——它是易失的。进程结束内存释放状态自然就丢了。这就好比一个健忘的助手每次见面都像第一次认识你。而“检查点”机制就是为了解决这个“健忘症”而生的。它本质上是一种持久化技术将工作流运行到某个步骤时的完整状态包括所有变量、历史消息、决策路径等保存到一个外部、非易失的存储介质中。最常见的介质就是数据库。这样无论进程是否重启我们都可以从上次保存的“检查点”恢复状态让工作流无缝衔接。所以当标题提到“PostgreSQL 持久化检查点”时它瞄准的正是LangGraph在生产环境落地的一个关键痛点状态的可恢复性与跨进程/会话的连续性。这不仅仅是“把数据存一下”那么简单它关乎到构建的Agent是否真正可靠、可用能否支撑起需要长时间运行、可能中断、甚至需要横向扩展的真实业务场景。2. 理解LangGraph的检查点机制不只是存个结果在深入PostgreSQL集成之前我们必须先吃透LangGraph自身的检查点抽象。很多人容易把它简单理解为“保存最终结果”但实际上它的设计要精巧和强大得多。2.1 检查点的核心状态快照与版本管理LangGraph的检查点机制包含两个核心部分状态快照在每个节点Node执行后LangGraph都会生成一个该时间点的全局状态State副本。这个状态包含了工作流定义的所有状态键State Keys的当前值。比如一个对话Agent的状态可能包含messages对话历史、sender当前发言者、turn_count对话轮次等。版本标识每个检查点都有一个唯一的标识符通常是一个自增的整数thread_id加上一个表示步骤的checkpoint_id。这形成了一条清晰的、可追溯的状态演进链。这种设计意味着你不仅可以恢复到上一次中断的地方理论上可以回溯到工作流历史上的任意一个步骤。这对于调试、审计、甚至实现“撤销/重做”功能都提供了可能。2.2 检查点的生命周期创建、读取与配置检查点的生命周期由Checkpointer接口定义LangGraph内置了内存实现MemorySaver而我们今天要做的就是用PostgreSQL来实现这个接口。其核心方法包括put_checkpoint: 保存一个检查点。get_checkpoint: 根据thread_id和可选的checkpoint_id获取一个检查点。如果不指定checkpoint_id则获取最新的。list_checkpoints: 列出某个thread_id下的所有检查点。在构建图时你需要通过checkpointer参数将检查点器实例传递给StateGraph。之后每次调用graph.invoke()时都需要传入一个config其中必须包含configurable字段其下的thread_id就是关联这次运行会话的关键。# 假设我们有一个检查点器实例 postgres_checkpointer graph StateGraph(...).compile(checkpointerpostgres_checkpointer) # 第一次运行或恢复一个已有的会话 config {configurable: {thread_id: user_123_session_1}} result graph.invoke(input_state, configconfig)这里的thread_id可以是你业务系统中的用户ID、会话ID、工单号等任何能唯一标识一次“对话”或“流程”的字符串。通过复用同一个thread_id你就能在不同时间、甚至不同服务器进程上恢复并继续同一个工作流。2.3 内存检查点的局限性MemorySaver简单易用适合快速原型验证但它将数据存在程序内存的字典里。这带来了几个无法克服的限制进程隔离不同进程无法共享状态。多实例部署时用户请求被负载均衡到不同实例状态就乱了。持久化缺失重启即丢失无法应对计划内或计划外的服务中断。容量与性能对于长时间运行、状态复杂的工作流内存占用会不断增长且有上限。因此要走向生产环境一个外部的、共享的、持久的检查点存储是必选项。PostgreSQL作为成熟稳定的关系型数据库是一个极佳的选择。3. 构建PostgreSQL检查点器从表设计到代码实现现在我们进入实战环节一步步构建一个属于自己的PostgreSQL检查点器。我将基于langgraph-checkpoint-postgres这个官方社区包的设计思路为你拆解其实现并补充大量实操中才会遇到的细节。3.1 数据库表结构设计如何高效存储状态设计表结构是第一步它直接决定了存储的效率和查询的便捷性。一个健壮的设计通常至少需要两张表。表1checkpoints (检查点主表)这张表存储每一次保存的检查点核心元数据和状态本身。CREATE TABLE checkpoints ( id BIGSERIAL PRIMARY KEY, thread_id VARCHAR NOT NULL, checkpoint_id VARCHAR NOT NULL, parent_checkpoint_id VARCHAR, checkpoint_type VARCHAR NOT NULL DEFAULT --checkpoint--, -- 状态本身以JSONB格式存储便于查询和索引 state JSONB NOT NULL, -- 元数据如创建时间、使用的图ID等 metadata JSONB DEFAULT --{}--::jsonb, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), -- 唯一约束确保同一线程内检查点ID唯一 UNIQUE(thread_id, checkpoint_id) );关键字段解析thread_idcheckpoint_id: 构成检索检查点的复合键。checkpoint_id在LangGraph中通常是一个如12的序列。parent_checkpoint_id: 指向父检查点的ID形成状态链对于实现分支、回溯至关重要。state(JSONB): 使用PostgreSQL的JSONB类型是点睛之笔。它不仅能存储复杂的嵌套结构还支持部分字段的索引和查询。比如你可以高效地查询所有state-’user_name’为特定值的检查点。metadata: 也是一个JSONB字段用于存储附属信息例如graph_id是哪个图的检查点、source是自动保存还是手动触发、tags用户自定义标签等。这为未来的功能扩展留足了空间。表2checkpoint_writes (写入记录表)这是一个可选的但非常实用的表用于实现写前日志模式这在分布式和高并发场景下能保证状态写入的幂等性和一致性。CREATE TABLE checkpoint_writes ( id BIGSERIAL PRIMARY KEY, thread_id VARCHAR NOT NULL, checkpoint_id VARCHAR NOT NULL, -- 写入内容的哈希用于去重 content_hash VARCHAR NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), UNIQUE(thread_id, checkpoint_id, content_hash) );它的工作原理是在真正向checkpoints表插入或更新数据前先尝试向checkpoint_writes表插入一条记录包含内容哈希。如果插入成功唯一约束未冲突说明这是第一次写入则继续完成主表的操作。如果插入失败说明相同内容的检查点已经有人写过了本次操作可以安全跳过避免重复写入。这能有效防止网络重试、进程崩溃恢复时导致的重复状态问题。3.2 核心接口实现Put, Get, List接下来我们用Python和asyncpg一个高效的PostgreSQL异步驱动来实现Checkpointer接口的核心方法。这里以异步版本为例同步版本逻辑类似。初始化与连接池管理注意在生产环境中务必使用连接池。直接为每个请求创建新连接是性能杀手也会很快耗尽数据库连接数。import asyncpg from langgraph.checkpoint.base import Checkpoint, CheckpointMetadata, CheckpointTuple from typing import Optional, Sequence import json class PostgresCheckpointer: def __init__(self, conn_string: str, pool_size10): self._pool: Optional[asyncpg.Pool] None self._conn_string conn_string self._pool_size pool_size async def connect(self): 初始化数据库连接池 if self._pool is None: self._pool await asyncpg.create_pool( dsnself._conn_string, min_size1, max_sizeself._pool_size, command_timeout60, ) # 可在此处执行建表语句确保表存在 async with self._pool.acquire() as conn: await conn.execute(CREATE_TABLES_SQL) async def put_checkpoint( self, checkpoint: Checkpoint, metadata: CheckpointMetadata, config: dict, ) - CheckpointTuple: 保存检查点 thread_id config[configurable][thread_id] checkpoint_id str(checkpoint[id]) parent_checkpoint_id checkpoint.get(parent_checkpoint_id) # 1. 序列化状态和元数据 state_json json.dumps(checkpoint[state]) metadata_json json.dumps({ graph_id: metadata.graph_id, ts: metadata.ts, source: metadata.source, step: metadata.step, # 可以注入更多自定义元数据 custom_data: metadata.config.get(custom_data, {}) }) # 2. (可选) 写前日志去重 content_hash self._generate_hash(state_json, metadata_json) async with self._pool.acquire() as conn: # 尝试插入写记录 try: await conn.execute( INSERT INTO checkpoint_writes (thread_id, checkpoint_id, content_hash) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING , thread_id, checkpoint_id, content_hash) except asyncpg.UniqueViolationError: # 重复写入直接获取现有的检查点返回即可 return await self._get_existing_checkpoint(conn, thread_id, checkpoint_id) # 3. 插入或更新主检查点表 # 使用UPSERT操作如果存在则更新 await conn.execute( INSERT INTO checkpoints (thread_id, checkpoint_id, parent_checkpoint_id, state, metadata) VALUES ($1, $2, $3, $4::jsonb, $5::jsonb) ON CONFLICT (thread_id, checkpoint_id) DO UPDATE SET state EXCLUDED.state, metadata EXCLUDED.metadata, parent_checkpoint_id EXCLUDED.parent_checkpoint_id, created_at NOW() , thread_id, checkpoint_id, parent_checkpoint_id, state_json, metadata_json) return CheckpointTuple(checkpointcheckpoint, metadatametadata) async def get_checkpoint( self, config: dict, checkpoint_id: Optional[str] None, ) - Optional[CheckpointTuple]: 获取检查点。如果未指定checkpoint_id则获取最新的。 thread_id config[configurable][thread_id] async with self._pool.acquire() as conn: if checkpoint_id is None: # 获取最新检查点 row await conn.fetchrow( SELECT state, metadata, checkpoint_id, parent_checkpoint_id FROM checkpoints WHERE thread_id $1 ORDER BY checkpoint_id DESC LIMIT 1 , thread_id) else: # 获取指定ID的检查点 row await conn.fetchrow( SELECT state, metadata, checkpoint_id, parent_checkpoint_id FROM checkpoints WHERE thread_id $1 AND checkpoint_id $2 , thread_id, checkpoint_id) if not row: return None # 反序列化 checkpoint { id: row[checkpoint_id], state: json.loads(row[state]), parent_checkpoint_id: row[parent_checkpoint_id], } metadata_dict json.loads(row[metadata]) metadata CheckpointMetadata(**metadata_dict) return CheckpointTuple(checkpointcheckpoint, metadatametadata)list_checkpoints方法实现相对简单就是根据thread_id查询checkpoints表按checkpoint_id排序返回。这里不再赘述。3.3 性能优化与生产级考量直接使用上述基础实现可以工作但在生产流量下可能会遇到瓶颈。以下是几个关键的优化点连接池配置asyncpg.create_pool的参数需要仔细调优。max_size不宜过大通常20-50避免拖垮数据库。max_inactive_connection_lifetime可以设置如300秒定期清理闲置连接。状态压缩对于复杂的Agentstate可能很大例如包含长对话历史或嵌入向量。直接存JSONB可能会占用大量空间。可以考虑在存入前对state进行压缩如gzip并在读取时解压。虽然增加了CPU开销但能显著减少I/O和存储成本。归档与清理策略检查点会随时间积累。需要制定策略例如只保留每个thread_id的最新N个检查点。将超过一定时间如30天的旧检查点转移到归档表或对象存储如S3。定期清理已完成会话可通过state中的某个结束标志判断的检查点。索引优化确保在checkpoints(thread_id, checkpoint_id)上建有复合索引这是最主要的查询路径。如果经常按metadata中的字段如graph_id查询可以考虑在JSONB字段上创建GIN索引。4. 集成与实战让LangGraph工作流“记住一切”有了自己的PostgresCheckpointer集成到LangGraph图中就非常简单了。我们通过一个完整的客服对话Agent例子来演示。4.1 定义一个有状态的工作流假设我们有一个客服Agent状态包括对话历史和用户情绪分数。from typing import TypedDict, Annotated, List from langgraph.graph import StateGraph, END from langgraph.checkpoint.postgres import PostgresCheckpointer # 假设我们把它封装好了 import operator class AgentState(TypedDict): messages: Annotated[List[str], operator.add] # 关键这是一个追加操作的状态键 customer_mood: float # 用户情绪分数0-1 current_step: str # 当前处理步骤 def receive_message(state: AgentState): 模拟接收用户消息 latest_msg 用户说我的订单还没发货已经三天了 return {messages: [latest_msg], customer_mood: 0.3} # 情绪低落 def analyze_mood(state: AgentState): 分析用户情绪这里简化处理 mood state[customer_mood] if mood 0.4: analysis 用户非常不满需要优先安抚和解决。 else: analysis 用户情绪尚可按流程处理。 return {messages: [f情绪分析{analysis}]} def propose_solution(state: AgentState): 根据情绪提出解决方案 if state[customer_mood] 0.4: solution 已为您加急处理订单并赠送一张10元优惠券作为补偿。 else: solution 正在为您查询订单物流请稍等。 return {messages: [f客服回复{solution}], current_step: solution_proposed} # 构建图 builder StateGraph(AgentState) builder.add_node(receive, receive_message) builder.add_node(analyze, analyze_mood) builder.add_node(propose, propose_solution) builder.set_entry_point(receive) builder.add_edge(receive, analyze) builder.add_edge(analyze, propose) builder.add_edge(propose, END)4.2 集成PostgreSQL检查点并运行import asyncio async def main(): # 1. 初始化检查点器并连接数据库 checkpointer PostgresCheckpointer( conn_stringpostgresql://user:passwordlocalhost:5432/langgraph_db, pool_size5 ) await checkpointer.connect() # 建立连接池 # 2. 编译图注入检查点器 graph builder.compile(checkpointercheckpointer) # 3. 模拟第一次用户交互 (会话 ID: support_ticket_1001) print(--- 第一次交互 ---) config_1 {configurable: {thread_id: support_ticket_1001}} initial_state {messages: [], customer_mood: 0.5, current_step: start} result1 await graph.ainvoke(initial_state, configconfig_1) print(f状态: {result1}) # 此时状态已被自动保存到PostgreSQL # 4. 模拟进程重启或第二次调用使用相同的thread_id print(\n--- 模拟进程重启后第二次交互 ---) # 注意这里没有传入initial_state图会从检查点加载最新状态。 result2 await graph.ainvoke( {messages: [用户追问那什么时候能发货]}, # 只传入新的输入 configconfig_1 # 相同的thread_id ) print(f状态: {result2}) # 你会看到result2中的messages包含了第一次的历史记录。 # 工作流从“propose”之后继续但因为我们设定了END需要根据业务逻辑设计循环或条件边。 # 5. 演示获取历史检查点 print(\n--- 查看会话 support_ticket_1001 的所有检查点 ---) checkpoints_list await checkpointer.alist_checkpoints(config_1) for cp in checkpoints_list: print(f检查点ID: {cp.checkpoint[id]}, 步骤: {cp.metadata.step}) if __name__ __main__: asyncio.run(main())这个例子清晰地展示了持久化的威力即使两次调用在物理上是独立的可以间隔数小时可以在不同的服务器上只要使用相同的thread_idAgent就能完美地保持会话连续性记得之前的所有对话历史和状态。4.3 高级模式分支、回溯与人工干预PostgreSQL检查点的强大之处还在于支持更复杂的工作流模式。分支与合并由于每个检查点都记录了其父节点ID (parent_checkpoint_id)你可以轻松实现基于条件的分支。例如根据customer_mood分数决定走“安抚流程”还是“标准流程”。两个分支最终可能合并它们的检查点会共享更早的祖先。状态回溯与调试通过list_checkpoints和get_checkpoint你可以获取任意历史状态。这在调试时非常有用当Agent给出了一个错误回复你可以精确地回退到出错前的那个检查点检查当时的完整状态定位问题根源。人工接管与状态编辑你可以直接从数据库读取某个检查点的stateJSONB手动修改其中的字段比如更正一个错误的用户信息然后将修改后的状态作为一个“新”的检查点写入并让工作流从这个修改过的状态继续执行。这为实现“人工坐席接管AI对话”提供了底层支持。5. 避坑指南与性能调优实战在实际部署中我踩过不少坑。这里分享几个最关键的经验希望能帮你绕开弯路。坑1连接池泄露这是异步编程中最常见的问题。务必确保每一个acquire()都有对应的release()或者使用async with pool.acquire() as conn:上下文管理器。泄露的连接会慢慢耗尽连接池导致后续请求无限等待或报超时错误。建议在代码中全局搜索acquire()确保其被正确管理。坑2状态序列化/反序列化性能瓶颈当state很大时比如包含长文本列表或向量json.dumps和json.loads会成为CPU热点。可以采取以下措施选择性持久化不是所有状态都需要持久化。LangGraph允许你通过checkpoint_metadata配置哪些状态键需要被检查点捕获。只存必要的。使用更快的序列化库比如orjson如果状态兼容或ujson它们比标准库的json快得多。异步序列化如果状态真的非常大可以考虑将序列化/反序列化操作放到一个单独的线程池中执行避免阻塞主事件循环。坑3PostgreSQL JSONB的索引滥用JSONB索引很强大但创建不当会拖慢写入速度并增加存储开销。遵循一个原则只为最常用的查询条件创建索引。例如如果你99%的查询都是WHERE thread_id ? AND checkpoint_id ?那么一个(thread_id, checkpoint_id)的B-tree复合索引就足够了。不要轻易为metadata里的每个字段都创建GIN索引。坑4未处理写冲突在高并发下两个进程可能同时尝试为同一个(thread_id, checkpoint_id)写入检查点。虽然数据库的唯一约束能防止数据错误但后写入的进程会收到UniqueViolationError。我们的put_checkpoint方法必须妥善处理这个异常——通常的策略是捕获异常然后转而执行一次读取操作返回已存在的检查点。这就是前面代码中ON CONFLICT DO UPDATE和写前日志表要解决的问题。坑5忘记设置合理的超时数据库操作可能因为网络或负载而变慢。一定要在连接池和具体查询上设置超时。self._pool await asyncpg.create_pool(..., command_timeout30, ...) # 或者在具体查询时 await conn.execute(SELECT ..., timeout10.0)超时后要有重试或降级策略例如短暂地回退到内存检查点并记录告警。性能调优实战建议监控先行在关键操作点put,get记录耗时。监控数据库的CPU、内存、连接数、慢查询日志。批量处理如果业务允许可以考虑批量写入检查点而不是每一步都写。但这会牺牲一定的实时性需要权衡。读写分离对于读多写少的场景如历史检查点查询可以考虑配置PostgreSQL流复制将读请求路由到只读副本减轻主库压力。定期维护如前所述定期归档和清理旧数据。一个无人清理的检查点表最终会拖慢整个系统。将LangGraph的状态持久化到PostgreSQL看似只是换了一个存储后端实则是将你的AI智能体从“玩具”升级为“生产级工具”的关键一步。它赋予了工作流记忆、延续和抗中断的能力。实现过程中从表结构设计、并发控制到性能调优每一个细节都考验着你对系统稳定性的理解。当你看到自己构建的Agent在重启后依然能接着上次的话头继续聊下去时那种成就感正是工程实践的乐趣所在。

相关新闻

Burp Suite自定义插件开发实战:从请求拦截到加解密处理

Burp Suite自定义插件开发实战:从请求拦截到加解密处理

1. 项目概述:为什么我们需要自定义Burp插件来拦截请求? 在安全测试和渗透测试的日常工作中,Burp Suite几乎是每个从业者手中的“瑞士军刀”。它的代理、重放、扫描功能强大,但你是否遇到过这样的场景:目标应用的请求参…

2026/8/10 19:24:33 阅读更多 →
压电促动器未来技术路线图:五大方向驱动下一代精密执行变革

压电促动器未来技术路线图:五大方向驱动下一代精密执行变革

当精密工程对位移精度的要求从纳米级迈向亚纳米级,当执行元件需要从洁净的实验室走向航空发动机舱或深空探测器,传统压电促动器的技术框架正面临前所未有的挑战与机遇。突破材料边界、融合智能算法、拓展极限工况——压电促动器的未来版图,正…

2026/8/10 19:52:25 阅读更多 →
Veo 3.1 怎么用?甜甜圈API 上 Veo 3.1 / Sora 2 的等待与轮询该这么写

Veo 3.1 怎么用?甜甜圈API 上 Veo 3.1 / Sora 2 的等待与轮询该这么写

接生视频 API 和接生图完全是两个难度。生图几秒到几十秒,一个同步请求就完事;视频生成接口动辄一两分钟起步,照着生图那套写,网关先给你一个 504。 这篇说清楚甜甜圈API(dashengfenshen.cn)上跑 Veo 3.1 …

2026/8/10 15:07:29 阅读更多 →

最新新闻

财务从入门到高手,必须吃透的8个核心指标!

财务从入门到高手,必须吃透的8个核心指标!

很多财务人员每天都在接触收入、成本、费用、利润、应收、库存和现金流,但真正到了经营分析会上,还是容易陷入一个问题:会算指标,却不会用指标发现问题。比如:收入增长了,究竟是销量增加、价格上涨&#xf…

2026/8/11 13:00:52 阅读更多 →
CentOS 7下源码编译安装Nginx 1.3.15指南

CentOS 7下源码编译安装Nginx 1.3.15指南

1. 项目概述 在CentOS 7环境下从源码编译安装nginx-1.3.15.tar.gz是一个典型的服务器环境配置任务。作为一款轻量级高性能的Web服务器,nginx以其出色的并发处理能力和低内存消耗著称,特别适合资源受限的生产环境。不同于直接使用yum安装预编译版本&#…

2026/8/11 13:00:52 阅读更多 →
RA-L2026 北京航空航天大学提出LAGCN框架:以空地协同实现未知环境语义导航

RA-L2026 北京航空航天大学提出LAGCN框架:以空地协同实现未知环境语义导航

痛点 在复杂未知环境中,传统无人车(UGV)的自主导航严重依赖激光雷达、深度相机等高成本多模态传感器。一旦感知受限或硬件受损,系统性能将显著下降,甚至完全失效。 当前产业与研究领域面临三大核心痛点: …

2026/8/11 13:00:52 阅读更多 →
Cursor破解工具完全指南:如何轻松绕过试用限制享受永久Pro功能

Cursor破解工具完全指南:如何轻松绕过试用限制享受永久Pro功能

Cursor破解工具完全指南:如何轻松绕过试用限制享受永久Pro功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached …

2026/8/11 13:00:52 阅读更多 →
Minecraft光影包终极指南:如何用Photon打造真实游戏视觉体验

Minecraft光影包终极指南:如何用Photon打造真实游戏视觉体验

Minecraft光影包终极指南:如何用Photon打造真实游戏视觉体验 【免费下载链接】photon A gameplay-focused shader pack for Minecraft 项目地址: https://gitcode.com/gh_mirrors/photon3/photon Photon光影包是一款专注于游戏体验的Minecraft着色器包&#…

2026/8/11 13:00:51 阅读更多 →
积木报表动态插入Excel图片的技术实现与优化

积木报表动态插入Excel图片的技术实现与优化

1. 项目背景与需求分析 在数据报表制作领域,积木报表因其灵活性和易用性成为众多企业的首选工具。但在实际业务场景中,我们经常遇到一个棘手问题:如何在积木报表生成的Excel文件中动态插入图片?这个需求在以下场景尤为常见&#x…

2026/8/11 12:59:51 阅读更多 →

日新闻

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南

如何用Video2X实现专业级视频画质提升:AI视频增强完整指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/v…

2026/8/11 0:00:02 阅读更多 →
前后端分离项目中控制台与接口工具数据差异排查指南

前后端分离项目中控制台与接口工具数据差异排查指南

1. 问题现象解析:控制台与Apifox的数据差异 最近在调试一个前后端分离项目时,遇到了一个典型问题:后端服务在本地开发环境控制台能正常输出查询数据,但通过Apifox测试时却返回空结果。这种"控制台有数据,接口工具…

2026/8/11 0:00:03 阅读更多 →
AI编程实战:从Claude Code踩坑到游戏开发入门

AI编程实战:从Claude Code踩坑到游戏开发入门

1. 从“AI能帮我做游戏”到“AI让我重新学编程”最近身边不少朋友,尤其是一些非技术背景、但对游戏开发有浓厚兴趣的朋友,都在问我同一个问题:“听说现在用Claude Code这种AI编程工具,小白也能做游戏了,是真的吗&#…

2026/8/11 0:00:03 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/11 1:08:05 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/11 1:08:05 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/11 1:08:05 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/10 17:07:33 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/11 1:08:06 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/10 17:07:33 阅读更多 →