Trae agent之:项目理解

243 阅读7分钟

为了在严肃编程时,对项目有完善的理解,写了一个memory dump的prompt

- 在每次对话前,都首先读取mem.json的内容。
- 如果没找找到mem.json,首先创建mem.json。
-- mem.json是一个当前对代码仓库理解的“记忆转储(memory dump)”,以 JSON 格式的图结构呈现:
-- 节点(nodes)包含名称(name)和观察结果(observations)。
-- 边(edges)包含名称(name)和描述(description)。
-- 需要深入分析项目的源代码,以获取更多关于项目结构、功能模块、依赖关系和实现细节的信息,以组织成更丰富的图结构,包括更多的节点(如具体的功能模块、核心类、重要接口等)和边(如调用关系、继承关系等)
-- 分析项目结构时,应该先了解项目的整体架构,再深入到具体实现细节
-- 请多次、迭代地读取项目的核心代码文件,对mem.json进行细节的扩充
-- 需要将mem.json文件内容进行格式化,适当的缩进和换行,使其更易于阅读和维护。

image.png

btw,Trae agent的prompt编辑框是可以展开的,方便阅读和编辑。

随便找了一个开源库,看看agent的生成过程和结果:

image.png

{
  "nodes": [
    {
      "name": "项目概述",
      "observations": "bcolz是一个提供列式存储和压缩数据容器的Python库。列式存储允许高效查询具有大量列的表格,并且支持廉价地添加和删除列。此外,bcolz对象默认被压缩以减少内存/磁盘I/O需求。压缩过程由Blosc内部执行,Blosc是一个针对二进制数据优化的高性能压缩器。项目目前处于无人维护状态。"
    },
    {
      "name": "核心数据结构",
      "observations": "bcolz提供两种主要的数据结构:carray和ctable。carray是一个压缩的一维数组,而ctable是一个由多个carray组成的表格结构,类似于关系数据库表。这些数据结构支持内存和磁盘存储模式,可以处理大于内存的数据集。"
    },
    {
      "name": "carray",
      "observations": "carray是bcolz的核心数据结构之一,它是一个压缩的一维数组,由carray_ext.pyx定义并实现。它支持类似NumPy数组的操作,但数据是压缩存储的。carray将数据分割成块(chunks)进行压缩存储,支持高效的追加操作和随机访问。carray实现了__getitem__、__setitem__等方法,支持类似NumPy的索引操作。"
    },
    {
      "name": "ctable",
      "observations": "ctable是bcolz的另一个核心数据结构,它是一个表格结构,由多个carray组成,每个carray代表一列。ctable支持类似SQL的查询操作,可以高效地处理大型表格数据。ctable类在ctable.py中定义,它提供了where、eval、iter等方法用于数据查询和处理。ctable还支持与pandas DataFrame的相互转换。"
    },
    {
      "name": "压缩功能",
      "observations": "bcolz使用Blosc作为其压缩引擎,支持多种压缩过滤器,包括NOSHUFFLE(0)、SHUFFLE(1)和BITSHUFFLE(2)。压缩参数可以通过cparams对象进行配置,包括压缩级别、块大小和过滤器类型。Blosc是一个高性能的压缩库,专为二进制数据优化,支持多线程压缩和解压缩。bcolz通过carray_ext.pyx中的C接口调用Blosc库函数。"
    },
    {
      "name": "顶层函数",
      "observations": "bcolz在toplevel.py中提供了多种顶层函数:open用于打开持久化的bcolz对象;fromiter从迭代器创建carray;arange创建等差数列的carray;zeros创建全0的carray;ones创建全1的carray;fill创建指定值的carray;iterblocks以块为单位迭代carray;set_nthreads设置线程数;detect_number_of_cores检测CPU核心数;print_versions打印依赖包版本信息;walk遍历目录查找bcolz对象。"
    },
    {
      "name": "依赖关系",
      "observations": "bcolz依赖于NumPy进行数组操作,依赖于Blosc进行数据压缩。它还可以选择性地使用numexpr(版本>=2.5.2)进行表达式评估,使用dask(版本>=0.9.0)进行分块计算,使用pandas和PyTables进行数据容器转换。bcolz在__init__.py中检测这些可选依赖的可用性。"
    },
    {
      "name": "文件存储",
      "observations": "bcolz对象可以存储在内存中,也可以持久化到磁盘上。当存储到磁盘时,数据和元数据被保存在指定的目录中,可以通过rootdir参数指定。持久化的bcolz对象使用特定的目录结构:DATA_DIR目录存储数据,META_DIR目录存储元数据,SIZES_FILE文件存储大小信息,STORAGE_FILE文件存储存储信息。bcolz使用JSON格式存储元数据。"
    },
    {
      "name": "cols类",
      "observations": "cols类用于访问ctable对象中的列。它负责读取和更新列的元信息,以及提供对列的访问和修改功能。cols类在ctable.py中定义,它维护了列名列表(names)和列对象字典(_cols),提供了__getitem__和__setitem__方法用于访问和修改列。cols类还负责将列的元信息持久化到磁盘上的ROOTDIRS文件中。"
    },
    {
      "name": "chunked_eval模块",
      "observations": "chunked_eval模块提供了eval函数,用于对bcolz对象进行分块表达式评估。它支持使用numexpr或dask作为计算引擎,可以高效地处理大型数据集的计算。eval函数可以接受字符串表达式或函数对象,对carray或ctable进行操作。该模块定义了_getvars函数用于从表达式中提取变量,is_sequence_like函数用于检查变量是否类似序列。eval函数支持多种虚拟机(vm)选项:'numexpr'(默认,如果可用)、'python'和'dask'(如果可用)。它还支持不同的输出格式(out_flavor):'carray'(默认)、'numpy'和'dask'。blen参数用于控制分块大小。"
    },
    {
      "name": "attrs模块",
      "observations": "attrs模块提供了对bcolz对象的属性进行管理的功能。每个bcolz对象都有一个attrs字典,可以存储用户自定义的元数据。attrs类实现了类似字典的接口,支持__getitem__、__setitem__、__delitem__、__iter__和__len__等方法。属性值必须能够通过JSON序列化以支持持久化。当bcolz对象持久化到磁盘时,属性存储在__attrs__文件中,使用JSON格式。attrs类提供了getall()方法返回所有属性的字典副本,_create()方法创建新的属性文件,_open()方法读取现有的属性文件,_update_meta()方法将属性更新到磁盘。"
    },
    {
      "name": "utils模块",
      "observations": "utils模块提供了各种实用函数,如build_carray用于从NumPy数组构建carray对象,以及其他辅助函数。这些函数被bcolz的其他模块广泛使用。"
    }
  ],
  "edges": [
    {
      "name": "组成关系",
      "description": "ctable由多个carray组成,每个carray代表表格中的一列。",
      "source": "ctable",
      "target": "carray"
    },
    {
      "name": "依赖关系",
      "description": "bcolz依赖于NumPy进行数组操作,依赖于Blosc进行数据压缩。",
      "source": "核心数据结构",
      "target": "依赖关系"
    },
    {
      "name": "实现关系",
      "description": "carray由carray_ext.pyx实现,这是一个Cython模块,提供了高性能的实现。",
      "source": "carray",
      "target": "压缩功能"
    },
    {
      "name": "访问关系",
      "description": "cols类提供了对ctable中列的访问和修改功能。",
      "source": "ctable",
      "target": "cols类"
    },
    {
      "name": "创建关系",
      "description": "顶层函数如open、fromiter、arange等用于创建carray和ctable对象。",
      "source": "顶层函数",
      "target": "核心数据结构"
    },
    {
      "name": "存储关系",
      "description": "bcolz对象可以存储在内存中,也可以持久化到磁盘上,通过rootdir参数指定存储目录。",
      "source": "核心数据结构",
      "target": "文件存储"
    },
    {
      "name": "计算关系",
      "description": "chunked_eval模块提供了对bcolz对象进行分块表达式评估的功能,支持使用numexpr或dask作为计算引擎。",
      "source": "chunked_eval模块",
      "target": "核心数据结构"
    },
    {
      "name": "属性管理关系",
      "description": "attrs模块提供了对bcolz对象的属性进行管理的功能,包括属性的存储和持久化。",
      "source": "attrs模块",
      "target": "核心数据结构"
    },
    {
      "name": "工具支持关系",
      "description": "utils模块提供了各种实用函数,如build_carray用于从NumPy数组构建carray对象。",
      "source": "utils模块",
      "target": "核心数据结构"
    },
    {
      "name": "线程管理关系",
      "description": "顶层函数set_nthreads用于设置bcolz操作使用的线程数,影响Blosc压缩和numexpr计算的性能。",
      "source": "顶层函数",
      "target": "压缩功能"
    },
    {
      "name": "数据转换关系",
      "description": "ctable支持与pandas DataFrame的相互转换,便于与pandas生态系统集成。",
      "source": "ctable",
      "target": "依赖关系"
    }
  ]
}

一个小技巧:可以输入框使用 # workspace,以获得项目的完整理解。Trae这类ai coding工具本来就有完善的Rag机制。

image.png

image.png

后续使用,也可以 # file,来强制让agent了解整个项目。

image.png