WWW.YOUINFO.SITE
标签聚合 Grep

/tag/Grep

LinuxDo 最新话题 · 2026-06-07 22:35:40+08:00 · tech

今天我在使用我自己的 Agent Dais 来理解一个项目时,发现它突然报错显示输入长度超过上下文上限,同时中转站的余额不足。 这引起了我的注意。我使用的是 gpt-5.4,有 1M 的上下文,在有 subagent 辅助读文件的情况下不应该出现上下文溢出的问题。我调了下中转站的使用日志,发现确实有连续的几个超过八十万 token 的请求,一下把账号的余额干完了。 排查过程 我导出了该任务的 message 数据后,另外开了一个任务来排查。由于 message 数据过长,我在提示词中明确说明只读开头的一小部分,让后让 agent 编写 python 脚本来找导致累计输入输出 token 大幅增长的元凶。 最后定位到原因是一个 ripgrep 调用,这个调用匹配到了项目源码中内嵌的一串 base64 超长文本,该文本本身可能就超过 1M 的字符数,导致上下文爆炸也是顺理成章。 解决方案 经过搜索,使用 ripgrep 时可以加上如下参数来限制单个匹配结果的展示长度(加上 --max-columns-preview 可以在文本溢出时保留部分文本用于预览): rg --max-columns 300 --max-columns-preview ... 本文转自我的个人博客,你可以点此查看原文: BHznJNs' Blog 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-03 13:58:29+08:00 · tech

用来给ai做上下文检索,配合rg,有佬试过吗? yoanbernabeu/grepai:面向人工智能代理的语义搜索和调用图(100% 本地化) — yoanbernabeu/grepai: Semantic Search & Call Graphs for AI Agents (100% Local) BeaconBay/ck:面向人工智能和人类的本地优先语义混合 BM25 grep / 搜索工具! — BeaconBay/ck: Local first semantic and hybrid BM25 grep / search tool for use by AI and humans! Ryandonofrio3/osgrep:面向 AI 代理的开源语义搜索 — Ryandonofrio3/osgrep: Open Source Semantic Search for your AI Agent 1 个帖子 - 1 位参与者 阅读完整话题

V2EX - 技术 · 2026-05-28 12:44:26+08:00 · tech

ricky@archlinux ~> sudo dmesg | grep -i i2c [sudo] password for ricky: [ 0.211745] ACPI BIOS Error (bug): Could not resolve symbol [_SB.PC00.I2C3.TPD0], AE_NOT_FOUND (20251212/dswload2-162) [ 0.211891] ACPI BIOS Error (bug): Could not resolve symbol [_SB.PC00.I2C4.TPL1], AE_NOT_FOUND (20251212/dswload2-162) [ 0.212028] ACPI BIOS Error (bug): Could not resolve symbol [_SB.PC00.I2C5.TPL1], AE_NOT_FOUND (20251212/dswload2-162) [ 0.237528] ACPI: _SB_.PC00.I2C3.PXTC: New power resource [ 0.238649] ACPI: _SB_.PC00.I2C4.PTPL: New power resource [ 0.239054] ACPI: _SB_.PC00.I2C5.PTPL: New power resource [ 1.207616] Modules linked in: i915(+) i2c_algo_bit drm_buddy ttm nvme intel_gtt nvme_core intel_lpss_pci serio_raw video nvme_keyring spi_intel_pci drm_display_helper nvme_auth intel_lpss hkdf spi_intel idma64 wmi cec intel_vsec [ 3.815849] i2c_dev: i2c /dev entries driver [ 4.195336] input: FTSC1000:00 2808:5662 as /devices/pci0000:00/0000:00:15.0/i2c_designware.0/i2c-0/i2c-FTSC1000:00/0018:2808:5662.0008/input/input18 [ 4.195401] input: FTSC1000:00 2808:5662 UNKNOWN as /devices/pci0000:00/0000:00:15.0/i2c_designware.0/i2c-0/i2c-FTSC1000:00/0018:2808:5662.0008/input/input20 [ 4.195467] hid-multitouch 0018:2808:5662.0008: input,hidraw7: I2C HID v1.00 Device [FTSC1000:00 2808:5662] on i2c-FTSC1000:00 [ 4.203661] input: TOPS0102:00 35CC:0104 Consumer Control as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-1/i2c-TOPS0102:00/0018:35CC:0104.0009/input/input22 [ 4.205224] input: TOPS0102:00 35CC:0104 Touchpad as /devices/pci0000:00/0000:00:15.1/i2c_designware.1/i2c-1i2c-TOPS0102:00/0018:35CC:0104.0009/input/input23 [ 4.205278] hid-multitouch 0018:35CC:0104.0009: input,hidraw8: I2C HID v1.00 Mouse [TOPS0102:00 35CC:0104] on i2c-TOPS0102:00 libinput list-devices 识别为两个设备 Device: TOPS0102:00 35CC:0104 Consumer Control Kernel: /dev/input/event12 Id: i2c:35cc:0104 Group: 5 Seat: seat0, default Capabilities: keyboard pointer Tap-to-click: n/a Tap-and-drag: n/a Tap button map: n/a Tap drag lock: n/a Left-handed: n/a Nat.scrolling: disabled Middle emulation: n/a Calibration: n/a Scroll methods: none Scroll button: n/a Scroll button lock: n/a Click methods: none Clickfinger button map: n/a Disable-w-typing: n/a Disable-w-trackpointing: n/a Accel profiles: n/a Rotation: 0.0 Area rectangle: n/a Device: TOPS0102:00 35CC:0104 Touchpad Kernel: /dev/input/event13 Id: i2c:35cc:0104 Group: 5 Seat: seat0, default Size: 130x92mm Capabilities: pointer gesture Tap-to-click: disabled Tap-and-drag: enabled Tap button map: left/right/middle Tap drag lock: disabled Left-handed: disabled Nat.scrolling: disabled Middle emulation: disabled Calibration: n/a Scroll methods: *two-finger edge Scroll button: n/a Scroll button lock: n/a Click methods: *button-areas clickfinger Clickfinger button map: left/right/middle Disable-w-typing: enabled Disable-w-trackpointing: enabled Accel profiles: flat *adaptive custom Rotation: n/a Area rectangle: n/a 尝试过修改启动内核参数 i2c_hid.reset_suspended=1 还有 ignore dmi ,都没用 偶尔冷启动能用手势,重启就没了,监听输入设备事件就只有左键触发,没有手势

LinuxDo 最新话题 · 2026-05-19 16:42:51+08:00 · tech

最近看到一些文章,说 claude code 在相对于以前的一些工具,选择了 grep 搜索而非进行建立向量,grep 搜索效果更好。 然后现在在做一个知识库系统,并非这种代码智能体。其中知识库中就会有很多 docx,pdf,ppt,扫描件之类的,是否有必要考虑,通过 mineru 之类的工具,将它们转化为 markdown,来给 agent 进行全文搜索,而不使用传统的向量知识库呢? 21 个帖子 - 10 位参与者 阅读完整话题

linux.do · 2026-04-24 21:18:32+08:00 · tech

[千星开源]与其让cc通过grep翻字典,不如给他一个仓库级别的chatgpt,x上20w粉丝大v推荐,大佬李笑来贡献,借鉴deepseek-ngram思想,项目自荐 开发调优 起步阶段这个名给了很大的贡献,也上过antigravity的谷歌开发者的社区,没想到antigravity倒了 ,佬有推荐的名字吗,我改改,欢迎提出新的仓库名,采纳后麦当劳穷鬼套餐一顿 具体在这里,目前经过佬的提醒,当前项目随着antigravity的摆烂,名字可能也不行了,有没有佬能给起一个新名字 6 个帖子 - 3 位参与者 阅读完整话题

linux.do · 2026-04-24 19:58:05+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 2025年末bash is all need思想的普及,包括claudecode,codex,cursor,antigravity等ai编程工具都采用了bash命令这种思想,例如,当我们让ai找一个具体的代码的时候,他会grep搜索相关的关键词,不停的翻看查找,这就有一个问题,我们刚操作ai助手的时候,他是一个比较纯洁的上下文,所以性能是最强的时候,随着上下文增多,性能越来越差,佬友们肯定感同身受。在算法层面,transform架构也面临同样的问题,deepseek-ngram(ps:有幸改了一个单词误用作为了deepseek-ngram仓库的贡献者)提出了一种解决思想,以空间为代价,换取性能上的优化,我的这个开源项目也借鉴了这种思想。 github.com GitHub - study8677/antigravity-workspace-template: 🪐 The ultimate starter kit for AI IDEs, Claude... 🪐 The ultimate starter kit for AI IDEs, Claude code,codex, and other agentic coding environments. 具体的思路如图,维护一个项目知识库及agent,claudecode和codex这种工具只需要ask就可以获取项目的非常详细的细节,而不用牺牲上下文,这个方案和subagent获取信息相比,更全面,也兼顾不同架构之间的信息,同时他也不依赖最顶级的claude/gpt的编程模型,测试时,minmax2.7这个级别的模型便可以很好的完成任务。 同时agent.md文件用的是python的import this,这个很简洁,平时使用也一直在用为系统提示词 项目开源之后,因为运气原因,不知不觉就1.1kstar了,逛l站也很久了,也开源了一些东西,也希望分析给佬友,如果有issue或者方向的指点,感激不尽。 当前的难点也很明显,之前只规划于python项目,所以有一层import架构层,有一个issue提出go项目不能用,所以就砍掉,借鉴了另一个知识图谱的项目,然后github_trending上有一个把仓库向量搜索的解决方案,个人认为向量匹配这方面并不是很优雅的解决方案,原因是,不够简单明了。 当前方案还有一个问题是,每次refresh都要全部来形成agent.md,这个很有问题,目前正在寻找解决方案,即每次只需要刷新改动部分,和git部分就好了。 (ps:在进入l站前,项目一直停滞,虽然实习公司报销订阅费,但是一直没有api来使用,感谢各位佬的教程,反代教学,得以咸鱼30块买到质保teams,项目才能很好的推进) 如果需要项目经历,欢迎pr,非破坏性质都会合并。 欢迎star 10 个帖子 - 5 位参与者 阅读完整话题

linux.do · 2026-04-19 20:01:26+08:00 · tech

本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 Agent文件系统检索核心:Grep和Glob工具 今天看到一篇文章,说在Harness的定义组件中,Agent的文件系统是核心之一 在文件系统的帮助下,Agent表现出来的搜索能力是非常出色的,用户和开发者不定义搜索路径,只提供输入驱动,而具体的搜索路径是由Agent根据每一次的工具调用动态决定的 Agent的文件检索能力的实现关键,就来源于基础工具:Grep和Glob 最近也在仔细读ClaudeCode的源码,具体的代码实现中有更多“补丁设计”,感觉对于新手不是很友好,读的时候,我觉得opencode或者gemini-cli的实现或许更友好一些,设计和实现都比较干净,如果有相同困惑的佬可以考虑看看 grep和glob这两个工具在很多Agent SDK都是自带的,一方面你可以不用从0开发,可以直接使用框架自带的方法,另外一方面也说明该工具的重要性,我觉得可以成为大模型一样开发claw模式下的基础设施工具 附加一张claudecode的SDK的图说明一下 本文节选自「大模型应用开发 - 上下文工程与运行空间实践指南」 上下文工程是设计原则,Agent Harness 是构建目标。完整内容已发布在 GitHub,欢迎查看 GitHub - WakeUp-Jin/Practical-Guide-to-Context-Engineering: 大模型应用开发的方向,上下文工程是设计原则,Agent Harness 是构建目标,本项目的目标,是为开发者和研究者提供一份大模型应用开发的骨架思路 · GitHub 一、Glob 工具实现 glob 工具是存在降级策略的,为了提高执行效率和降低运行占用量 实现 glob 工具有两种方式,这两种方式“各有各的”好处 glob 依赖包 :返回的是完整的文件的信息(存在文件元信息等,例如文件大小,文件修改时间),所以不需要额外的操作,并且 glob 依赖包是天然的 Node 环境的包 ripgrep 命令 :返回的是文件路径,没有任何文件元信息,所以需要在操作读取文件信息的操作, stat 方法,但是 ripgrep 检索的速度是比 glob 快的,但是 ripgrep 是 Rust 实现的,所以运行时需要加载一个二进制文件 关于 glob 工具执行的总时间,这里有一个形象的公式: 总时间=检索时间+ N*单文件的处理时间 glob 依赖包的实现方式,后面的那个单文件处理时间完全可以忽略不计,所以其检索时间就约等于总时间 ripgrep 命令的实现方式,检索时间是比 glob 依赖包的方式更快的,但是其需要单文件的处理时间,也就是 stat 方法的调用时间 我的建议和总结是: 如果是追求开发方便 ,那么我是建议直接使用 glob 实现,会快很多,并且不需要考虑外部文件的执行 如果是追求可操作的检索效率 ,那么是可以考虑使用 ripgrep 来实现,检索工具不可能只实现 glob,也会考虑使用 grep 的,要实现 grep,ripgrep 这个命令是优先考虑的,这么一看也不算是另外单独引入一个外部依赖 如果是追求稳定 ,那么可以考虑降级策略,先使用 ripgrep,如果 ripgrep 这个环境不存在或者下载失败,那么就可以降级为 glob,保证了程序或者项目可以运行 二、Grep 工具的实现 目前 grep 有四种的方式实现,按照优先级排序,保证系统的稳定的可用性,使用降级策略保证 grep 工具执行成功,我们会先验证这些策略的可用性,再考虑优先级高的先使用 ripgrep:是使用 Rust 编写的二进制文件,检索速度非常非常快 git grep 命令:这个是直接读取.git/index 中已缓存的文件列表,跳过耗时的目录遍历操作 系统的 grep 命令:大部分是传统的 C 实现的,单线程递归搜索,速度还可以,大部分 Unix 系统都有,不过 windows 系统是没有的 js 实现的 grep 命令:是纯 JS 实现的,是一个保底方案,用 glob 获取文件列表,逐个读取文件内容,逐行正则匹配,速度最慢 三、Ripgrep 自动下载机制 ripgrep 命令的执行需要完整的路径,在 Node 子进程中使用 spawn 的时候,需要完整的路径才可以成功执行命令 async function grepWithRipgrep(pattern, cwd, options) { // 获取 ripgrep 路径 const rgPath = await Ripgrep.filepath(options.binDir); // 返回:/usr/bin/rg 或 ~/.reason/bin/rg // 使用路径执行命令 const proc = spawn(rgPath, [ '--line-number', '--no-heading', pattern, ], { cwd }); } 所以目前的判断获取的策略是这样的: 先看看内存缓存中是否存在,如果没有就进入下一级,有就返回 再看看系统是否有安装 ripgrep,如果有就返回并且赋值给缓存,下一次就可以直接缓存取啦,如果没有就下一级 然后在看看本地路径是否安装了 ripgrep 的二进制文件,要是有安装的话,和上面同理,如果没有就开始进行下载文件到相应的目录中 四、超时控制 实现这个需求,在 Node 中会使用到中止控制器 AbortController/AbortSignal ,这里有一个简单的例子: const controller = new AbortController(); function customTask(signal: AbortSignal): Promise<string> { return new Promise((resolve, reject) => { //初始状态的检查 if (signal.aborted) { reject(new Error('Task aborted')); return; } const timer = setTimeout(() => resolve('done'), 5000); // 使用 { once: true } 自动清理监听器 const abortHandler = () => { clearTimeout(timer); reject(new Error('Task aborted')); }; signal.addEventListener('abort', abortHandler, { once: true }); // 或者手动清理(如果需要在 resolve 时也清理) const cleanup = () => { signal.removeEventListener('abort', abortHandler); }; // 修改 timer 回调 const timerCallback = () => { cleanup(); resolve('done'); }; setTimeout(timerCallback, 5000); }); } customTask(controller.signal); // 3秒后取消 setTimeout(() => { controller.abort(); }, 3000); AbortController :这个是控制器,用来发送“取消”信号 AbortSignal :这个是信号,传递给异步操作,让它们可以被取消 关于 AbortSignal 这个对象,有一些属性是值得理解一下的,会让你在异步操作使用更加熟练 interface AbortSignal{ readonly aborted:boolean //是否已经被取消 readonly reason:any //取消的原因 //监听取消事件 addEventListener( type:'abort', listener:(event:Event)=>void, options?:{once?:boolean} ):void //移除取消事件监听器 removeEventListener( type:'abort', listener:(event:Event) => void ):void //用于检查信息是否已取消 throwIfAborted():void } 那我们开始整理超时控制的函数式如何写的,主要就是三步: 封装取消函数,这个函数返回信号对象 创建一个包装器,传入要取消的函数操作,用于包装任何的异步操作 传入参数给异步操作 //完整的核心代码如下 //1、创建取消函数,返回信号对象 export function createTimeoutSignal( timeoutMs: number, externalSignal?: AbortSignal ): { signal: AbortSignal; cleanup: () => void; isTimeout: () => boolean; } { const controller = new AbortController(); let timedOut = false; // 超时定时器 const timeoutId = setTimeout(() => { timedOut = true; controller.abort(); }, timeoutMs); // 监听外部中止信号 const abortHandler = () => { clearTimeout(timeoutId); controller.abort(); }; externalSignal?.addEventListener('abort', abortHandler, { once: true }); // 清理函数 const cleanup = () => { clearTimeout(timeoutId); externalSignal?.removeEventListener('abort', abortHandler); }; return { signal: controller.signal, cleanup, isTimeout: () => timedOut, }; } //2、创建异步操作包装器 export async function withTimeout<T>( promiseFactory: (signal: AbortSignal) => Promise<T>, timeoutMs: number, operation: string, externalSignal?: AbortSignal ): Promise<T> { // 1. 提前检查 if (externalSignal?.aborted) { throw createAbortError(); } // 2. 创建超时信号 const { signal, cleanup, isTimeout } = createTimeoutSignal(timeoutMs, externalSignal); try { // 3. 执行操作,传入信号 const result = await promiseFactory(signal); // 4. 成功完成,清理资源 cleanup(); return result; } catch (error) { // 5. 失败,清理资源 cleanup(); // 6. 如果是超时导致的中止,抛出 TimeoutError if (isTimeout() && isAbortError(error)) { throw createTimeoutError(operation, timeoutMs); } // 7. 其他情况原样抛出 throw error; } } //3、传递取消信号为进程执行的异步函数 - 简化版 function spawnAsync(command: string, args: string[], signal?: AbortSignal): Promise<void> { return new Promise((resolve, reject) => { const proc = child_process.spawn(command, args); // 监听取消信号 signal?.addEventListener('abort', () => { proc.kill(); reject(new Error('Aborted')); }, { once: true }); proc.on('close', (code) => { code === 0 ? resolve() : reject(new Error(`Exit code ${code}`)); }); proc.on('error', reject); }); } await withTimeout( (signal) => spawnAsync('long-command', [], { signal }), 5000, // 5秒超时 'command execution', userCancelSignal // 用户可手动取消 ); 1 个帖子 - 1 位参与者 阅读完整话题