检索系统
在体验了当前一个比较热门的辅助编程项目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: