首页 文章 精选 留言 我的

精选列表

搜索[布局逻辑],共10003篇文章
优秀的个人博客,低调大师

OpenAI 详解 Codex CLI 核心逻辑:Agent loop

OpenAI 发布技术文章系统拆解了其编程 Agent 产品 Codex CLI 背后的 “Agent loop” 核心机制,展示了 LLM Agent 如何在软件开发任务中高效协作与自我迭代。 “Agent loop”是 Codex 在处理用户指令时的核心执行流程:从接收用户输入开始,Codex 不仅让大模型进行推理,还引导模型反复调用工具、执行动作、观察输出,并最终生成准确回复(或代码更改)。这一循环持续进行,直到模型返回最终结果。 关键步骤包括: 构建 Prompt(提示词):将用户输入和上下文信息打包成用于模型推理的指令集。 模型推理(Inference):将 Prompt 转换为 token 并送入模型生成输出。 工具调用:模型可能发出工具请求,如执行 shell 命令或访问文件系统,Agent 执行后将结果反馈给模型。 重复循环:根据新信息重组 Prompt,再次请求模型,直到输出终结信息交付用户。 相比传统单向对话系统,这种循环整合了推理+动作执行+反馈整合,使得 Codex 能够自主完成更复杂的编程任务,而不仅仅是生成文本回复。 面向 Responses API 的构建方式 Codex CLI 借助 Responses API 与 LLM 通信,其支持多种部署环境: 使用 ChatGPT 登录:通过 ChatGPT 后端 API 接入。 API key 认证:调用标准 OpenAI Responses API。 本地 open-source 模型:支持如 ollama、LM Studio 的本地服务。 这种可配置性让开发者可以在本地部署、云端托管或混合架构中运行 Codex,实现更灵活的开发集成。 Prompt 构建细节与角色分层 OpenAI 详细解释了 Prompt 的组成与权重机制: system / developer / user / assistant 角色区分不同来源与优先级的信息。 系统自动注入权限、安全沙箱规范、开发者指令等多层内容。 环境信息(如当前工作目录、shell 类型)也被编码进 Prompt。 这些细节有助于精细控制 Agent 行为、规范权限边界,并提升模型调用的可靠性。 性能与上下文管理 随着对话或任务执行的循环次数增长,Prompt 会不断膨胀。OpenAI 指出: Prompt 缓存能显著提升性能,但仅在完全前缀匹配时生效。 为避免上下文窗口耗尽,Codex 会自动调用新的 Responses API 压缩上下文(compaction),用摘要表示早期对话内容以节省 token。 这些策略对于长期工程任务(如复杂代码编辑、多轮推理)至关重要。 完整内容查看原文:https://openai.com/index/unrolling-the-codex-agent-loop/

优秀的个人博客,低调大师

阿里云postgreSQL数据库逻辑备份

一、创建阿里云存储网关参考链接:https://help.aliyun.com/document_detail/108244.html 注意购买OSS bucket的区域与数据库实例所在的区域不同。 二、在与存储网关同一区域的ECS机器上面,挂载存储网关:mount.nfs x.x.x.x:/shares /ossx.x.x.x:/shares是网关的挂载点,/oss为本地目录参考链接:https://help.aliyun.com/document_detail/108284.html最好将nfs挂载点也写入/etc/fstab文件,重启自动挂载。 三、在ECS机器上安装postgreSQL备份工具1、https://www.postgresql.org/ftp/source/ 下载相应的数据库版本(与云rds版本相近) 2、解压、安装编译安装目录为:/usr/local/pgsql/gunzip postgresql-10.1.tar.gztar xf postgresql-10.1.tar./configure --prefix=/usr/local/pgsql/makemake install 在pg_dump用户目录下,新建.pgpass文件,权限设为600,或者更小的权限格式形如: hostname:port:database:username:password 四、编写postgreSQL备份脚本 #!/bin/bash hostname=xxx.pg.rds.aliyuncs.com username=xxx port=xxx database=xxx dt=`date +%Y%m%d` /usr/local/pgsql/bin/pg_dump -h $hostname -U $username -p $port -d $database -o -f /oss/db_$dt.bak if [ -z "`find /oss -name "*.bak" -mtime 0 -print0`" ] then echo "warning!postgreSQL_backup is failure,please check it!" | mail -s postgreSQL-backup xxx@xxx.com fi 将脚本添加进任务计划中,即可。 五、还原方法登录ECS主机,执行命令:/usr/local/pgsql/bin/pgsql -h xxx.pg.rds.aliyuncs.com -U xxx -d xxx < db_xxx.bak

优秀的个人博客,低调大师

疯狂ios讲义之实现游戏逻辑(3)

13.6.9两个转折点的连接 两个转折点的连接是最复杂的一种连接情况,因为两个转折点又可分为如下几种情况。 p1、p2位于同一行,但不能直接相连,就必须有两个转折点,分向上与向下两种连接情况。 p1、p2位于同一列,但不能直接相连,也必须有两个转折点,分向左与向右两种连接情况。 p2在p1的右下角,有6种转折情况。 p2在p1的右上角,同样有6种转折情况。 提示: 对于p2位于p1的左上角、左下角的情况,同样只要把p1、p2的位置互换即可。 对于上面4种情况,同样需要分别进行处理。 1.同一行不能直接相连 p1、p2位于同一行,但它们不能直接相连,因此必须有两个转折点,图13.13显示了这种相连的示意图。 从图13.13可以看到,当p1与p2位于同一行但不能直接相连时,这两个点既可在上面相连,也可在下面相连,这两种情况都代表它们可以相连。我们先把这两种情况都加入结果中,最后计算最近的距离。 实现时可以先构建一个NSDictionary,NSDictionary的key为第一个转折点,NSDictionary的value为第二个转折点(每种连接情况最多只有两个连接点),如NSDictionary的count大于1,说明这两个FKPoint有多种连接途径,那么程序还需要计算路径最小的连接方式。 2.同一列不能直接相连 p1、p2位于同一列,但它们不能直接相连,因此必须有两个转折点,图13.14显示了这种相连的示意。 图13.13同一行不能直接相连 图13.14同一列不能直接相连 从图13.14可以看到,当p1与p2位于同一列但不能直接相连时,这两个点既可在左边相连,也可在右边相连,这两种情况都代表它们可以相连。我们先把这两种情况都加入结果中,最后计算最近的距离。 实现的方法与同一行不能直接相连的情况相同。 3.p2位于p1右下角的6种转折情况 p2位于p1右下角时,一共可能出现6种连接情况,图13.15~图13.20分别绘制了这6种连接情况。 图13.15p2位于p1右下角有两个转折点的情况1 图13.16p2位于p1右下角有两个转折点的情况2 图13.17p2位于p1右下角有两个转折点的情况3 图13.18p2位于p1右下角有两个转折点的情况4 图13.19p2位于p1右下角有两个转折点的情况5 图13.20p2位于p1右下角有两个转折点的情况6 实际上,p2还可能位于p1的右上角,出现的6种连接情形与此相似,此处不再详述。 接下来定义一个getLinkPoints方法对具有两个连接点的情况进行处理。 程序清单:codes/13/Link/Link/sources/board/FKGameService.m 程序中的粗体字代码分别调用getYLinkPoints: p2Chanel: pieceHeight:、getXLinkPoints: p2Chanel: pieceWidth:方法来收集各种可能出现的连接路径,两个方法的代码如下。 程序清单:codes/13/Link/Link/sources/board/FKGameService.m 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 /** * 遍历两个集合,先判断第一个集合中元素的x坐标与另一个集合中元素的x坐标是否相同(纵向), * 如果相同,即在同一列,再判断是否有障碍,没有则加到NSMutableDictionary中 * @return 存放可以纵向直线连接的连接点的键值对 */ - (NSDictionary*) getYLinkPoints:(NSArray*) p1Chanel p2Chanel:(NSArray*) p2Chanel pieceHeight:(NSInteger) pieceHeight { NSMutableDictionary* result = [[NSMutableDictionary alloc]init]; for ( int i = 0; i < p1Chanel.count; i++) { FKPoint* temp1 = [p1Chanel objectAtIndex:i]; for ( int j = 0; j < p2Chanel.count; j++) { FKPoint* temp2 = [p2Chanel objectAtIndex:j]; // 如果x坐标相同(在同一列) if (temp1.x == temp2.x) { // 没有障碍则加到结果的NSMutableDictionary中 if (![self isYBlockFromP1:temp1 toP2:temp2 pieceHeight:pieceHeight]) { [result setObject:temp2 forKey:temp1]; } } } } return [result copy]; } /** * 遍历两个集合,先判断第一个集合中元素的y坐标与另一个集合中元素的y坐标是否相同(横向), * 如果相同,即在同一行,再判断是否有障碍,没有则加到NSMutableDictionary中 * @return 存放可以横向直线连接的连接点的键值对 */ - (NSDictionary*) getXLinkPoints:(NSArray*) p1Chanel p2Chanel:(NSArray*) p2Chanel pieceWidth:(NSInteger) pieceWidth { NSMutableDictionary* result = [[NSMutableDictionary alloc]init]; for ( int i = 0; i < p1Chanel.count; i++) { // 从第一通道中取一个点 FKPoint* temp1 = [p1Chanel objectAtIndex:i]; // 再遍历第二个通道,看第二通道中是否有点可以与temp1横向相连 for ( int j = 0; j < p2Chanel.count; j++) { FKPoint* temp2 = [p2Chanel objectAtIndex:j]; // 如果y坐标相同(在同一行),再判断它们之间是否有直接障碍 if (temp1.y == temp2.y) { if (![self isXBlockFromP1:temp1 toP2:temp2 pieceWidth:pieceWidth]) { // 没有障碍则加到结果的NSMutableDictionary中 [result setObject:temp2 forKey:temp1]; } } } } return [result copy]; } 经过上面的实现之后,getLinkPointsFromPoint: toPoint: width: height:方法可以找出point1、point2两个点之间所有可能的连接情况,该方法返回一个NSDictionary对象,NSDictionary中每个key-value对代表一种连接情况,其中key代表第一个连接点,value代表第二个连接点。 当point1、point2之间有多种连接情况时,程序还需要找出所有连接情况中的最短路径,link(Piece p1, Piece p2)方法中的④号粗体字代码调用了getShortcutFromPoint: toPoint: turns: distance:方法进行处理,下面进行详细分析。 13.6.10找出最短距离 为了找出所有连接情况中的最短路径,程序实现可分为两步。 ①遍历转折点NSDictionary中的所有key-value对,与原来选择的两个点构成一个FKLinkInfo。每个FKLinkInfo代表一条完整的连接路径,并将这些FKLinkInfo收集成一个NSArray集合。 ②遍历第1步得到的NSArray集合,计算每个FKLinkInfo中所有连接点的总距离,选取与最短距离相差最小的FKLinkInfo返回即可。 下面的方法实现了上面的思路。 程序清单:codes/13/Link/Link/sources/board/FKGameService.m 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 /** * 获取p1和p2之间最短的连接信息 * @param p1 第一个点 * @param p2 第二个点 * @param turns 放转折点的NSDictionary * @param shortDistance 两点之间的最短距离 * @return p1和p2之间最短的连接信息 */ - (FKLinkInfo*) getShortcutFromPoint:(FKPoint*) p1 toPoint:(FKPoint*) p2 turns:(NSDictionary*) turns distance:(NSInteger)shortDistance { NSMutableArray* infos = [[NSMutableArray alloc] init]; // 遍历结果NSDictionary for (FKPoint* point1 in turns) { FKPoint* point2 = turns[point1]; // 将转折点与选择点封装成FKLinkInfo对象,放到NSArray集合中 [infos addObject:[[FKLinkInfo alloc] initWithP1:p1 p2:point1 p3:point2 p4:p2]]; } return [self getShortcut:infos shortDistance:shortDistance]; } /** * 从infos中获取连接线最短的那个FKLinkInfo对象 * @param infos * @return 连接线最短的那个FKLinkInfo对象 */ - (FKLinkInfo*) getShortcut:(NSArray*) infos shortDistance:( int ) shortDistance { int temp1 = 0; FKLinkInfo* result = nil; for ( int i = 0; i < infos.count; i++) { FKLinkInfo* info = [infos objectAtIndex:i]; // 计算出几个点的总距离 NSInteger distance = [self countAll:info.points]; // 将循环第一个的差距用temp1保存 if (i == 0) { temp1 = distance - shortDistance; result = info; } // 如果下一次循环的值比temp1还小, 则用当前的值作为temp1 if (distance - shortDistance < temp1) { temp1 = distance - shortDistance; result = info; } } return result; } /** * 计算NSArray中所有点的距离总和 * @param points 需要计算的连接点 * @return 所有点的距离总和 */ - (NSInteger) countAll:(NSArray*) points { NSInteger result = 0; for ( int i = 0; i < points.count - 1; i++) { // 获取第i个点 FKPoint* point1 = [points objectAtIndex:i]; // 获取第i + 1个点 FKPoint* point2 = [points objectAtIndex:i + 1]; // 计算第i个点与第i + 1个点的距离,并添加到总距离中 result += [self getDistanceFromPoint:point1 toPoint:point2]; } return result; } /** * 获取两个点之间的最短距离 * @param p1 第一个点 * @param p2 第二个点 * @return 两个点的距离距离总和 */ - (CGFloat) getDistanceFromPoint:(FKPoint*) p1 toPoint:(FKPoint*) p2 { int xDistance = abs (p1.x - p2.x); int yDistance = abs (p1.y - p2.y); return xDistance + yDistance; } 至此,《疯狂连连看》游戏中两个方块可能相连的所有情况都处理完成了,应用程序即可调用FKGameService所提供的(FKLinkInfo*) linkWithBeginPiece:(FKPiece*)p1 endPiece: (FKPiece*) p2方法来判断两个方块是否可以相连,这个过程也是编写该游戏最烦琐的地方。 通过对《疯狂连连看》游戏的分析与开发,读者应该发现编写一个游戏并没有想象的那么难,开发者需要冷静、条理化的思维,先分析游戏中所有可能出现的情况,然后在程序中对所有的情况进行判断,并进行相应的处理。 提示: 本程序中FKGameService组件的实现思路与《疯狂Android讲义》中Android版《疯狂连连看》游戏的实现思路基本相同,笔者无法保证这种实现方式为最优算法。这种算法实现起来有些烦琐,但它的条理十分清晰,非常适合初、中级程序员学习。 13.7小结 本章介绍了一款常见的单机休闲类游戏——iOS版的《疯狂连连看》,这款流行的小游戏的开发难度适中,而且能充分激发学习热情,对iOS学习者来说是一个不错的选择。学习本章需要重点掌握单机游戏的界面分析与数据建模的能力:游戏玩家眼中看到的是游戏界面,开发者眼中看到的应该是数据模型。除此之外,单机游戏通常总会有一个比较美观的界面,因此,通常都需要通过自定义UIView来实现游戏主界面。《疯狂连连看》游戏中需要判断两个方块(图片)是否可以相连,这需要开发者对两个方块的位置分别进行处理,并针对不同的情况提供相应的实现,这也是开发单机游戏需要重点掌握的能力。 ——————本文节选自《疯狂ios讲义(上)》 本文转自 fkJava李刚51CTO博客,原文链接:http://blog.51cto.com/javaligang/1361533,如需转载请自行联系原作者

优秀的个人博客,低调大师

发布NBD创业平台,联想的内在逻辑

NBD,New Business Development,中文直译为“新业务扩展部”。 这是联想在今天发布的一个(关于物联网的)创业平台。在联想的口径里,NBD的中文讲法叫“新板凳”,一个很俗、但也很接地气的名字。 简单的说,NBD“新板凳”就是联想新开了一个NBD事业部,可以接入一些有一定成熟度的硬件项目,联想提供从销售渠道到产品原型定义、软件开发不等的能力,最终产品贴上联想Logo开售。 在新平台的发布中,联想也随之发布了三款由其孵化的智能硬件产品:智能眼镜、智能路由器、智能空气净化器。其中智能眼镜有两个型号,针对个人的new glass和针对商用领域与Vuzix合作推出的M100;智能路由器名为new wifi,与成都谛听科技合作推出;智能空气净化器有三个针对不同房间面积的型号,分别为new air X330、LUFTMED

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册