CoIR代码检索基准:从原理到实战,全面评估代码嵌入模型性能

news2026/5/15 3:00:21
1. 项目概述为什么我们需要一个专门的代码检索基准在当今的软件开发、代码生成和智能编程辅助领域检索增强生成RAG技术正变得无处不在。无论是让大语言模型LLM帮你写一段代码还是在庞大的代码库中快速定位一个函数定义其核心都依赖于一个关键环节代码检索。简单来说就是根据一段自然语言描述比如“用Python实现一个快速排序函数”或一段代码片段比如一个函数调用从海量的代码文档中找到最相关、最准确的代码块。听起来和文本检索很像对吧但实际操作过你就会发现这完全是两码事。文本检索模型处理的是连贯的自然语言而代码是高度结构化、充满符号和特定语法的“另一种语言”。一个在MTEB大规模文本嵌入基准上表现优异的通用文本嵌入模型比如text-embedding-ada-002或bge-large-zh直接拿来搜代码效果往往会大打折扣。它可能无法理解“self”在面向对象编程中的上下文含义或者混淆了“”等于和“”赋值的根本区别。这就是CoIR诞生的背景。作为一个专注于代码信息检索的综合性基准它填补了学术界和工业界长期以来的一个空白。在我过去评估各种代码助手或尝试构建内部代码知识库时最头疼的就是没有一套统一、权威的标准来衡量不同检索模型在代码任务上的真实能力。大家各说各话用的数据集五花八门评估指标也不统一导致很难横向比较更别提针对性地优化模型了。CoIR的出现就像为代码检索领域建立了一套“普通话等级考试”和“奥林匹克竞赛”。它汇集了10个精心策划的数据集覆盖了代码翻译、问答、代码搜索、代码纠错、文本转SQL等8种核心任务横跨7个不同的编程领域。总计超过两百万份文档的规模确保了评估的全面性和挑战性。更重要的是它提供了与MTEB、BEIR等主流文本检索基准一致的数据接口和评估框架这意味着开发者可以几乎无成本地将自己为文本优化的流水线迁移到代码评估上或者进行跨模态的能力对比。接下来我将带你深入拆解CoIR从设计理念、数据集构成到如何用它来评估你自己的模型并分享我在实际使用中积累的实操经验和避坑指南。2. CoIR核心设计解析它如何构建一个可靠的“考场”一个优秀的基准测试其价值不仅在于数据量更在于其设计的科学性和对现实场景的贴合度。CoIR在这方面做了大量细致的工作我们可以从以下几个维度来理解它的核心设计。2.1 任务场景的多样性与代表性CoIR没有局限于单一的“代码搜索”任务而是构建了一个多维度的评估体系。这10个数据集大致可以分为几类核心场景语义代码搜索这是最经典的任务例如codesearchnet和cosqa。给定一个自然语言查询如“如何用Python读取JSON文件”从代码库中找出实现该功能的代码片段。这直接对应着开发者日常在IDE或搜索引擎中的行为。代码到代码的检索例如codetrans-dl和codetrans-contest。给定一段源代码如Java代码找出其功能等价的另一种编程语言如Python的实现。这在代码迁移、多语言项目维护中非常实用。社区问答检索以stackoverflow-qa为代表。给定一个问题标题或描述从Stack Overflow的历史问答对中找出最相关的答案代码。这模拟了开发者从社区寻求解决方案的过程。代码反馈与纠错包括codefeedback-mt和codefeedback-st。给定一段有缺陷或可以优化的代码以及一条自然语言反馈如“这里存在内存泄漏风险”找出对应的修复后的代码。这对构建智能代码审查工具至关重要。文本到结构化查询如synthetic-text2sql。给定一个自然语言问题如“列出所有销售额超过10000的订单”找出能正确回答该问题的SQL语句。这在数据库查询、商业智能场景应用广泛。代码生成与补全apps数据集包含了竞赛级别的编程问题及其解决方案要求模型根据问题描述检索出正确的解题代码这对代码生成模型的检索能力提出了更高要求。这种设计确保了被评估的模型不是“偏科生”。一个模型可能在搜索Python函数上很强但面对跨语言翻译或代码纠错任务就可能露怯。CoIR迫使模型去理解代码更深层的语义、结构和意图。2.2 数据质量与挑战性CoIR的数据并非简单爬取而是经过了严格的清洗、去重和标注。以codesearchnet-ccr为例它是codesearchnet的“困难版”Code-Code Retrieval其中的负样本不相关的代码是经过精心构造的与查询在表面词汇或简单语法上可能相似但语义完全不同这极大地增加了检索难度更能区分模型性能的细微差别。此外数据集的规模差异也很大。小的如codefeedback-st仅数千对样本适合快速验证大的如codesearchnet有数十万对适合进行大规模、稳定的性能评估。这种搭配既满足了研究初期快速迭代的需求也保证了最终结论的稳健性。2.3 评估框架的友好与严谨CoIR最大的亮点之一是其极低的接入成本。它完全兼容Hugging Face的datasets库和MTEB框架。这意味着一键加载数据你不需要手动下载、解压、解析各种奇怪格式的文件。一行get_tasks调用就能获得标准化、可直接用于模型输入的数据迭代器。标准化评估流程内置了检索任务的标准评估流程包括嵌入生成、相似度计算、排序以及最终指标如nDCG10, MAP, Recallk等的计算。你只需要关心如何实现模型的encode_queries和encode_corpus方法。结果可复现与可比较由于使用了统一的评估脚本和指标不同团队、不同时期在CoIR上报告的结果具有直接可比性。这为整个领域的研究进展提供了清晰的标尺。3. 实战指南如何用CoIR评估你的第一个代码检索模型理论说再多不如亲手跑一遍。下面我将以一个完整的例子展示如何使用CoIR评估一个开源的文本嵌入模型在代码检索任务上的表现。我们会选择intfloat/e5-base-v2这个模型因为它体积适中、性能不错且支持通过添加指令前缀query:和passage:来区分查询和文档这在检索任务中是常见的最佳实践。3.1 环境准备与安装首先确保你的Python环境在3.8以上。创建一个干净的虚拟环境是个好习惯。# 创建并激活虚拟环境以conda为例 conda create -n coir-eval python3.10 conda activate coir-eval # 安装coir-eval包这是最推荐的方式 pip install coir-eval # 同时安装transformers和sentence-transformers用于加载模型 pip install transformers sentence-transformers torch注意官方推荐通过pip install coir-eval安装。虽然也可以从源码安装pip install -e .但前者更稳定能自动处理依赖。CoIR为了解决BEIR中pytrec_eval依赖安装困难的问题已经将其替换为pytrec-eval-terrier因此通过pip安装通常非常顺利。3.2 基础评估使用预封装模型对于像Sentence-Transformers或E5这类有标准接口的模型CoIR的评估可以非常简洁。下面是一个最基础的评估脚本我们只在codetrans-dl这个任务上做快速测试。import coir from sentence_transformers import SentenceTransformer # 1. 选择模型和任务 model_name intfloat/e5-base-v2 model SentenceTransformer(model_name) # 2. 获取评估任务。这里先只用一个任务进行快速验证。 # 所有可选任务列表 # [codetrans-dl, stackoverflow-qa, apps, codefeedback-mt, # codefeedback-st, codetrans-contest, synthetic-text2sql, # cosqa, codesearchnet, codesearchnet-ccr] tasks coir.get_tasks(tasks[codetrans-dl]) # 3. 初始化评估器。batch_size根据你的GPU内存调整。 from coir.evaluation import COIR evaluation COIR(taskstasks, batch_size32) # 对于e5-basebatch_size32在12GB显存上通常安全 # 4. 运行评估。结果会自动保存到指定文件夹并返回一个汇总字典。 results evaluation.run(model, output_folderfresults/{model_name.replace(/, _)}) print(results)运行这段代码后你会看到控制台开始输出进度条。CoIR会自动完成以下工作从Hugging Face下载codetrans-dl数据集。使用你的模型为所有查询queries和语料库文档corpus生成嵌入向量。计算每个查询与所有文档的余弦相似度并排序得到Top-K结果。将排序结果与标准答案qrels对比计算出一系列检索指标。将指标结果打印出来并同时保存到results/intfloat_e5-base-v2/codetrans-dl目录下的JSON文件中。首次运行会因为下载数据集而较慢后续运行会直接使用缓存。输出的results字典结构清晰包含了每个指标的具体数值。3.3 理解评估输出与核心指标评估完成后控制台打印和结果文件里会看到像下面这样的指标数值为示例{ codetrans-dl: { nDCG10: 0.4567, MAP100: 0.3210, Recall100: 0.7890, Recall1000: 0.9123, Precision10: 0.2345 } }这些指标是什么意思在代码检索中我们最应该关注哪几个nDCG10 (Normalized Discounted Cumulative Gain)这是衡量排序质量的核心指标通常被视为首要参考。它不仅考虑相关文档是否被检索到还考虑它们被排在第几位。排名越靠前贡献的分值越高。10表示只考虑前10个结果。这个值越接近1越好。RecallK (召回率)表示在前K个结果中找到了多少比例的相关文档。Recall100和Recall1000在代码检索中很重要因为开发者有时需要浏览较多结果。高的Recall1000意味着模型“漏掉”相关代码的可能性较低。MAP100 (Mean Average Precision)对所有查询的平均精度AP求平均。AP综合考虑了不同召回率水平下的精度是另一个衡量整体排序性能的稳健指标。PrecisionK (精确率)前K个结果中相关文档所占的比例。在代码检索中我们通常希望第一页比如前10个的结果尽可能精确以减少用户的浏览成本。实操建议在模型对比和论文报告中nDCG10和Recall100是最常被引用的两个指标。前者重排序质量后者重检索全率。你可以根据你的应用场景有所侧重如果是IDE的实时代码补全nDCG10和Precision5可能更重要如果是构建代码知识库进行大规模分析Recall1000可能更关键。4. 高级用法集成自定义模型与API模型在实际研发中我们评估的往往是自定义模型或商业API。CoIR通过要求用户实现一个特定接口的类来支持这种灵活性。这是最能体现其框架优势的地方。4.1 集成自定义的PyTorch/Hugging Face模型假设你有一个自己微调过的BERT模型用于代码检索。你需要定义一个类并实现encode_queries和encode_corpus方法。下面的例子展示了如何封装一个使用均值池化Mean Pooling的Transformer模型。import torch import numpy as np from transformers import AutoTokenizer, AutoModel from typing import List, Dict import logging from tqdm.auto import tqdm class CustomHuggingFaceModel: def __init__(self, model_name_or_path: str, device: str None, **kwargs): 初始化自定义模型。 Args: model_name_or_path: 本地路径或Hugging Face模型ID。 device: 指定设备如 cuda:0 或 cpu。默认为自动选择。 self.device device if device else (cuda if torch.cuda.is_available() else cpu) logging.info(fLoading model on device: {self.device}) self.tokenizer AutoTokenizer.from_pretrained(model_name_or_path) self.model AutoModel.from_pretrained(model_name_or_path).to(self.device) self.model.eval() # 设置为评估模式 def _mean_pooling(self, model_output, attention_mask): 标准的均值池化策略对非填充token的嵌入取平均。 token_embeddings model_output.last_hidden_state input_mask_expanded attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float() sum_embeddings torch.sum(token_embeddings * input_mask_expanded, 1) sum_mask torch.clamp(input_mask_expanded.sum(1), min1e-9) return sum_embeddings / sum_mask def encode_text(self, texts: List[str], batch_size: int 32, max_length: int 512, **kwargs) - np.ndarray: 核心编码函数将文本列表编码为嵌入向量。 all_embeddings [] for i in tqdm(range(0, len(texts), batch_size), descEncoding texts): batch_texts texts[i:i batch_size] # 编码文本 encoded_input self.tokenizer( batch_texts, paddingTrue, truncationTrue, max_lengthmax_length, return_tensorspt ).to(self.device) # 前向传播不计算梯度 with torch.no_grad(): model_output self.model(**encoded_input) # 池化得到句子向量 batch_embeddings self._mean_pooling(model_output, encoded_input[attention_mask]) all_embeddings.append(batch_embeddings.cpu().numpy()) # 拼接所有批次的嵌入 return np.vstack(all_embeddings) def encode_queries(self, queries: List[str], **kwargs) - np.ndarray: 编码查询。可以为查询添加特定前缀以优化性能。 # 对于E5类模型添加query: 前缀是标准做法。其他模型可能需要调整或省略。 prefixed_queries [fquery: {q} for q in queries] return self.encode_text(prefixed_queries, **kwargs) def encode_corpus(self, corpus: List[Dict[str, str]], **kwargs) - np.ndarray: 编码语料库。每个字典项应包含text键。 # 同样为文档添加passage: 前缀 corpus_texts [fpassage: {doc[text]} for doc in corpus] return self.encode_text(corpus_texts, **kwargs) # 使用示例 from coir import get_tasks from coir.evaluation import COIR # 初始化你的自定义模型 my_model CustomHuggingFaceModel(./my-finetuned-code-bert) # 选择任务 tasks get_tasks(tasks[codesearchnet, cosqa]) # 初始化并运行评估 evaluator COIR(taskstasks, batch_size64) results evaluator.run(my_model, output_folderresults/my_custom_model) print(results)关键点解析与避坑指南池化策略的选择上述例子使用了均值池化这是最通用的方法。但对于某些模型如BERT本身使用[CLS]token的嵌入model_output.last_hidden_state[:, 0]可能更原汁原味。你需要根据预训练模型的设计来选择。例如E5模型就明确推荐使用均值池化。前缀的重要性对于像E5、BGE这类在指令数据上微调过的检索模型为查询和文档添加前缀query:和passage:至关重要这能显著提升性能。如果你的模型没有经过此类训练可以不加前缀直接编码原始文本。批处理与内存管理batch_size是平衡速度和内存的关键。如果遇到CUDA内存不足OOM错误首先尝试减小batch_size。其次可以尝试在encode_text内部使用with torch.cuda.amp.autocast():进行混合精度推理以减少显存占用并可能加速。文本截断max_length参数需要谨慎设置。代码片段可能很长。设置过短会丢失信息过长则影响效率和内存。通常512对于大多数代码检索任务是一个合理的起点。你可以统计一下数据集中代码长度的分布来做出决定。4.2 集成商业API模型以OpenAI为例评估像OpenAI的text-embedding-3-small或Voyage的voyage-code-2这类API模型也很常见。关键在于处理API的速率限制和错误重试。下面是一个集成OpenAI Embedding API的示例类。import openai import numpy as np import time from typing import List, Dict import logging from tqdm.auto import tqdm class OpenAIModel: def __init__(self, model_name: str text-embedding-3-small, api_key: str None, requests_per_minute: int 3000): 初始化OpenAI API模型。 Args: model_name: OpenAI嵌入模型名称。 api_key: OpenAI API密钥。如果为None会尝试从环境变量OPENAI_API_KEY读取。 requests_per_minute: API速率限制每分钟请求数。根据你的套餐调整。 self.client openai.OpenAI(api_keyapi_key) self.model_name model_name self.requests_per_minute requests_per_minute self.delay 60.0 / self.requests_per_minute # 每次请求间的最小间隔秒 def encode_text(self, texts: List[str], batch_size: int 50, **kwargs) - np.ndarray: 调用OpenAI API进行编码。OpenAI API本身支持批量但这里我们实现简单的流控。 all_embeddings [] # OpenAI的嵌入接口有输入token总数限制对于代码batch_size不宜过大。 for i in tqdm(range(0, len(texts), batch_size), descCalling OpenAI API): batch_texts texts[i:i batch_size] try: response self.client.embeddings.create( modelself.model_name, inputbatch_texts, encoding_formatfloat # 确保返回浮点数列表 ) batch_embeddings [data.embedding for data in response.data] all_embeddings.extend(batch_embeddings) except openai.RateLimitError: logging.warning(Rate limit hit, sleeping for 60 seconds.) time.sleep(60) continue # 重试当前批次 except Exception as e: logging.error(fAPI call failed: {e}) raise e # 遵守速率限制 time.sleep(self.delay) return np.array(all_embeddings) def encode_queries(self, queries: List[str], **kwargs) - np.ndarray: 编码查询。OpenAI的通用嵌入模型通常不需要特殊前缀。 # 如果需要可以添加指令。但text-embedding-3系列是通用模型通常不需要。 # prefixed_queries [fQuery: {q} for q in queries] return self.encode_text(queries, **kwargs) def encode_corpus(self, corpus: List[Dict[str, str]], **kwargs) - np.ndarray: 编码语料库。 corpus_texts [doc[text] for doc in corpus] return self.encode_text(corpus_texts, **kwargs) # 使用示例 # 假设你的OPENAI_API_KEY已设置在环境变量中 api_model OpenAIModel(model_nametext-embedding-3-small) tasks get_tasks(tasks[stackoverflow-qa]) # 选一个任务测试API调用有成本 evaluator COIR(taskstasks, batch_size16) # batch_size在这里指CoIR内部组织数据的大小不影响API调用批次。 # 注意评估大量数据时API成本会很高。建议先在小数据集或子集上测试。 results evaluator.run(api_model, output_folderresults/openai_embedding_3_small) print(results)API模型评估的注意事项成本控制这是最大的限制。CoIR的数据集规模庞大完整评估一次可能消耗数十甚至上百万tokens。务必先在一个最小的任务如codefeedback-st或使用数据集的子集可通过tasks[0].corpus tasks[0].corpus[:1000]临时修改上进行测试确认流程无误后再进行全量评估。速率限制与错误处理必须实现健壮的速率控制如time.sleep和错误重试逻辑特别是RateLimitError。上面的示例提供了一个简单版本生产环境可能需要更复杂的退避策略。Tokenization与截断API模型通常有输入长度限制如8191 tokens。虽然代码检索的单个条目通常不会超长但最好在encode_text方法中加入长度检查和截断逻辑防止请求被拒绝。异步优化对于大规模评估可以考虑使用异步请求如aiohttp来并发调用API以大幅减少总耗时。但这会显著增加代码复杂度需要小心处理并发限制和错误。5. 性能优化与调试实战经验当你开始用CoIR评估较大模型或较大数据集时可能会遇到性能瓶颈或各种错误。这里分享一些我踩过坑后总结的经验。5.1 加速推理与内存优化场景评估一个7B参数量的模型在codesearchnet约20万文档上速度极慢且显存爆炸。解决方案启用FP16或BF16混合精度这能有效减少显存占用并加速计算。在自定义模型的encode_text方法中def encode_text(self, texts: List[str], batch_size: int 32, max_length: int 512) - np.ndarray: all_embeddings [] self.model.eval() with torch.no_grad(): with torch.cuda.amp.autocast(): # 启用自动混合精度 for i in tqdm(range(0, len(texts), batch_size)): batch_texts texts[i:i batch_size] encoded_input self.tokenizer(batch_texts, paddingTrue, truncationTrue, max_lengthmax_length, return_tensorspt).to(self.device) model_output self.model(**encoded_input) batch_embeddings self._pooling(model_output, encoded_input[attention_mask]) all_embeddings.append(batch_embeddings.cpu().float()) # 注意转换回FP32 return torch.cat(all_embeddings, dim0).numpy()使用更好的注意力实现安装xformers库并在模型加载时启用内存高效的注意力机制这对长序列代码尤其有效。from transformers import AutoModel model AutoModel.from_pretrained(model_name, use_xformersTrue).to(device)梯度检查点对于极大的模型可以在前向传播中启用梯度检查点来以时间换空间但在纯推理模式下通常不需要。分批处理与磁盘缓存如果数据集太大无法一次性装入内存可以修改评估循环分多次运行每次处理一部分查询和文档并将中间嵌入向量保存到磁盘如.npy文件最后再统一计算相似度。CoIR本身不直接支持这种模式但你可以通过分拆任务或修改数据加载器来实现。5.2 常见错误与排查错误ModuleNotFoundError: No module named pytrec_eval原因你可能直接安装了原始的beir库它依赖pytrec_eval而这个包在某些系统上编译困难。解决确保你安装的是coir-eval而不是beir。coir-eval已经将依赖替换为pytrec-eval-terrier。运行pip uninstall beir pytrec_eval然后pip install coir-eval。错误CUDA out of memory原因batch_size太大或模型/序列太长。排查步骤将batch_size减小到1看是否可行。如果可行逐步增加。在代码开始时使用torch.cuda.empty_cache()清理缓存。检查数据集中文本的最大长度适当减小max_length。可以在encode_text方法中添加日志打印文本长度分布。考虑使用CPU进行编码虽然慢但内存大。初始化模型时指定devicecpu。错误评估结果指标全部为0或极低原因这是最令人困惑的问题之一。可能的原因有嵌入归一化问题CoIR内部使用余弦相似度。如果你的嵌入向量没有进行L2归一化而模型输出的向量模长差异很大会严重影响相似度计算。解决方案在encode_text方法返回前对嵌入向量进行归一化。import numpy as np def encode_text(self, texts, ...): # ... 生成 embeddings_np ... norms np.linalg.norm(embeddings_np, axis1, keepdimsTrue) norms[norms 0] 1e-10 # 防止除零 embeddings_np_normalized embeddings_np / norms return embeddings_np_normalized查询/文档前缀不匹配对于E5等模型必须确保查询和文档使用了正确的前缀query:和passage:且拼写一致。一个常见的错误是在encode_corpus中漏掉了前缀。池化层错误检查你的池化函数是否正确提取了句子级别的向量。打印出单个样本的嵌入向量看看其形状和值是否合理例如应该是768维的浮点数向量而不是一个序列。警告数据集下载慢或失败原因Hugging Face数据集服务器网络问题。解决可以设置环境变量HF_DATASETS_OFFLINE1尝试使用离线缓存或者使用镜像源。更可靠的方式是提前下载数据集到本地然后修改coir/data_loader.py中的加载路径指向本地目录这需要一些代码修改能力。6. 解读结果与模型选型建议跑完评估拿到一沓指标数据后如何从中提炼出对项目有价值的洞察这里有一些思路。6.1 横向对比为自己的项目选择模型假设你在为公司的内部代码库构建一个检索系统现在测试了三个模型在CoIR上的部分结果数值为虚构仅作示意模型nDCG10 (平均)Recall100 (平均)模型大小推理速度 (doc/s)备注intfloat/e5-base-v20.420.75440M1200通用文本模型对代码有一定理解Salesforce/SFR-Embedding-Code0.580.881.5B300专为代码训练性能领先text-embedding-3-small(API)0.500.82-API限制易用但需网络和费用如何决策性能优先如果检索准确率是生命线且基础设施能承受那么代码专用模型如Salesforce、BGE-Code、Voyage-Code是毋庸置疑的最佳选择。它们在代码语义理解上具有显著优势。成本与延迟敏感如果需要在资源有限的边缘设备或要求极低延迟的在线服务中部署较小的通用模型如e5-base或gte-small可能是更好的折衷。虽然绝对指标低一些但性价比高。快速原型与验证在项目初期使用OpenAI或Cohere的API模型可以让你跳过模型部署和维护的复杂性快速验证想法的可行性。确认价值后再考虑私有化部署专用模型。任务特异性仔细查看模型在不同子任务上的表现。你的应用场景更接近stackoverflow-qa问答还是codetrans-dl代码翻译选择在你目标场景上表现最好的模型而不是平均分最高的。6.2 纵向分析定位模型弱点以指导微调如果你的自定义模型效果不理想CoIR的细分任务结果是指明优化方向的“诊断报告”。如果在codesearchnet上表现好但在codefeedback-mt上差可能意味着你的模型擅长理解“做什么”功能描述但不擅长理解“哪里错”代码缺陷。你需要收集更多代码纠错配对数据来进行针对性微调。如果Recall1000很高但nDCG10很低说明模型能把相关文档找出来但排序很靠后。这可能是因为模型生成的嵌入在向量空间中区分度不够或者相似度计算方式有问题。可以尝试使用对比学习损失如InfoNCE进行更激进的微调。在推理时对嵌入进行更精细的归一化或后处理。引入重排序Re-ranker模型对初步检索出的Top K结果进行二次精排。6.3 理解MTEB与CoIR Leaderboard的差异你可能会发现同一个模型在 MTEB官方榜单 和 CoIR独立榜单 上的排名或分数略有差异。这通常是以下原因造成的评估设置不同MTEB集成CoIR时可能采用了默认的评估参数如相似度计算方式、评分聚合方法而CoIR自己的脚本可能有细微调整。务必以你本地用相同代码和参数跑出来的结果为准。数据版本数据集可能有细微更新。硬件与随机性嵌入生成和评估过程中的随机性如dropout如果未关闭以及不同的硬件CPU/GPU可能导致浮点数计算的微小差异进而影响最终指标。最佳实践在论文或内部报告中汇报结果时明确说明你使用的CoIR代码版本、评估脚本的commit hash以及关键参数如batch_size,max_length, 池化方法以确保结果的可复现性。经过这样一轮从理论到实践从使用到调试的完整探索你应该已经能够熟练地运用CoIR这个强大的工具来度量、分析和提升代码检索模型的能力了。它不仅仅是一个榜单更是一套完整的、工程友好的评估体系能实实在在地帮助我们在代码智能的道路上走得更稳、更远。记住可靠的评估是任何模型迭代的基石而CoIR正是为代码检索领域打造的这块基石。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2595462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…