Skip to content

检索系统

在体验了当前一个比较热门的辅助编程项目cursor后,还是有一点小小的震撼的,至少在一些python项目上,我认为cursor是能够切实起到“提升生产力”的作用的,同时,我也积累了一些疑惑:cursor工作的原理是不是rag?如果是,那么它们是如何建立索引,如何聚合项目的上下文信息的?特别是大型项目文件较多,cursor如何获取代码中的语义信息呢?

首先,第一个问题很快便能确认,从cursor的招聘信息就能找到了:

开源项目:aider

抱着上面的疑惑,我去找了一下有没有类似的开源项目可以参考的,很快便看到了aider。

aider的工作模式

全局解析

代码中有两个很关键的对象:

  • Coder

  • RepoMap

前者是llm_coder的一个抽象,负责聚合各种信息然后发送给llm,后者是一个可以解析项目全局信息的工具类,在aider实际工作的过程中必然是Coder实例调用RepoMap实例进行解析,具体代码可以看我下面提取的内容:

python
Class Coder:
    if use_repo_map and self.repo and has_map_prompt:
        self.repo_map = RepoMap(
            map_tokens,
            self.root,
            self.main_model,
            io,
            self.gpt_prompts.repo_content_prefix,
            self.verbose,
            max_inp_tokens,
            map_mul_no_files=map_mul_no_files,
            refresh=map_refresh,
        )
    ...
    def get_repo_map(self, force_refresh=False):
        if not self.repo_map:
            return

        cur_msg_text = self.get_cur_message_text()
        mentioned_fnames = self.get_file_mentions(cur_msg_text)
        mentioned_idents = self.get_ident_mentions(cur_msg_text)

        mentioned_fnames.update(self.get_ident_filename_matches(mentioned_idents))

        all_abs_files = set(self.get_all_abs_files())
        repo_abs_read_only_fnames = set(self.abs_read_only_fnames) & all_abs_files
        chat_files = set(self.abs_fnames) | repo_abs_read_only_fnames
        other_files = all_abs_files - chat_files

        repo_content = self.repo_map.get_repo_map(
            chat_files,
            other_files,
            mentioned_fnames=mentioned_fnames,
            mentioned_idents=mentioned_idents,
            force_refresh=force_refresh,
        )s Coder:

知识在于积累