资讯动态

OpenScholar 官方实现深度解析:基于 peS2o 检索与自反馈循环的科研文献综述生成管线

发布时间:2026/10/14 16:16:58 来源:尧图企业网站定制
人工智能RAGNLP微调模型推理服务【免费下载链接】OpenScholarThis repository includes the official implementation of OpenScholar: Synthesizing Scientific Literature with Retrieval-augmented LMs.项目地址https://gitcode.com/gh_mirrors/op/OpenScholar点击查看免费下载OpenScholar 是 Allen AI 面向科学文献综述场景的检索增强语言模型Retrieval-Augmented LM官方实现其核心目标是从 4500 万篇论文规模的数据集中检索相关段落再由 LLM 生成带引用标注的综合回答并通过检索 → 重排 → 生成 → 自反馈 → 后置引用校验的完整管线持续迭代精化答案。本文基于仓库根目录的 README.md结合 run.py、src/open_scholar.py、src/instructions.py 与 retriever/ 的源码实现完整讲解环境搭建、四种推理管线的命令配置、参数含义、底层调用链以及离线 peS2o 检索索引的构建与在线服务方式读完后你可以直接复现 OpenScholar 的端到端推理流程并自行扩展其检索源。一、项目定位与仓库组织README 指出科学进步依赖于在海量文献中发现、综合并继承相关知识而每年数百万篇新发表论文使研究者难以及时跟进单一子领域的最新进展。OpenScholar 即为帮助科学家检索并综合科学文献而设计的检索增强 LM先搜索相关论文再生成基于这些来源的回答。从仓库结构看代码分为三个职责清晰的部分见 README.md 的 Repository Organizations 一节src/OpenScholar 主体推理代码核心为 src/open_scholar.py 中的OpenScholar类与 src/instructions.py 中定义的全部提示词training/基于改造版torchtune的训练代码用于用其处理的 13k 指令数据训练 Llama 3.1 8B 底座retriever/离线构建 peS2o 检索索引、执行离线检索以及托管在线检索服务端的代码库。自动与人工评估代码分别位于独立的 ScholarQABench 和 OpenScholar_ExpertEval 仓库中不在本仓库内本文不作展开。二、环境安装与 API 密钥准备运行 OpenScholar 推理前需要安装依赖README.md 的 Installation 一节给出的官方命令conda create -n os_env python3.10.0 conda activate os_env pip install -r requirements.txt python -m spacy download en_core_web_sm对照 requirements.txt推理侧依赖包括vllm、FlagEmbedding、transformers、openai、datasets、torch、spacy、nltk、bs4、pandas等。其中vllm用于本地加载并推理开放权重模型见 run.py 中vllm.LLM(modelargs.model_name, tensor_parallel_sizetorch.cuda.device_count(), enforce_eagerTrue, ...)的实例化方式——张量并行度自动取全部 GPU 数量FlagEmbedding提供重排器FlagRerankerrun.py 中以FlagReranker(args.reranker, use_fp16True)加载spacy的en_core_web_sm模型在 src/open_scholar.py 顶部被加载nlp spacy.load(en_core_web_sm)同时nltk.sent_tokenize用于后置引用阶段的句子切分。此外需要设置两个环境变量# Semantic Scholar API 密钥外部检索必需 export S2_API_KEYYOUR_S2_API_KEY # 如需使用 you.com 网页搜索 API可选 export YOUR_API_KEYYOUR_YOU_COM_API_KEYS2_API_KEY在 src/use_search_apis.py 通过os.environ[S2_API_KEY]读取用于调用 Semantic Scholar Graph API 检索论文元数据与摘要PES2O_INDEX_URLsrc/use_search_apis.py则需替换为你自行托管的 peS2o 检索服务地址。三、运行 OpenScholar 推理run.py 与四种管线run.py 是统一的推理入口。输入文件支持.jsonl经 src/utils.py 的load_jsonlines加载或.json允许顶层含data键的包装格式也支持--dataset直接从 Hugging Face datasets 加载测试集。数据字段上input字段缺失时会自动从question或query回退取值run.py。process_input_datarun.py在生成前对上下文做了统一的清洗归一把不同检索 API 返回的ctxs结构展平为 dict 列表将retrieval text统一改名为text剔除空文本调用process_paragraph去除cit.占位符与已有的[数字]引用标记并按正文前 100 字符 标题去重。官方给出四种典型用法3.1 标准 RAG 管线Top 10 段落直接生成python run.py \ --input_file YOUR_INPUT_FILE \ --model_name OpenScholar/Llama-3.1_OpenScholar-8B \ --use_contexts \ --output_file OUTPUT_FILE_PATH \ --top_n 10 --llama3 --zero_shot3.2 检索器 重排器管线Retriever Rerankerpython run.py \ --input_file YOUR_INPUT_FILE \ --model_name OpenScholar/Llama-3.1_OpenScholar-8B \ --use_contexts \ --ranking_ce \ --reranker OpenScholar/OpenScholar_Reranker \ --output_file OUTPUT_FILE_PATH \ --top_n 10 --llama3 --zero_shot3.3 自反思生成管线Retriever Reranker 反馈循环 Semantic Scholar 增补检索python run.py \ --input_file YOUR_INPUT_FILE \ --model_name OpenScholar/Llama-3.1_OpenScholar-8B \ --use_contexts --output_file OUTPUT_FILE_NAME \ --top_n 10 --llama3 --use_contexts \ --ranking_ce --reranker OpenScholar/OpenScholar_Reranker \ --posthoc --feedack --ss_retriever \ --use_abstract --norm_cite --zero_shot --max_per_paper 3 \该配置叠加了后置引用校验--posthoc注意 README 原文中--feedack为拼写错误实际 argparse 参数名为--feedback见 run.py、Semantic Scholar API 增补检索--ss_retriever、摘要参与重排--use_abstract、引用数归一化加权--norm_cite以及每篇论文最多取 3 个段落--max_per_paper 3。3.4 结合专有 LM如 OpenAI GPT-4o通过--model_name、--api、--api_key_fp三个参数即可将同一条 OpenScholar 管线接到专有模型上run.py 会构造 OpenAI 兼容客户端--api together/--api anyscale分别指向对应服务商的 base_url其余取值走默认 OpenAI 端点python run.py \ --input_file YOUR_INPUT_FILE \ --model_name gpt-4o \ --api openai \ --api_key_fp PATH_TO_YOUR_OPEN_AI_KEY \ --use_contexts \ --output_file OUTPUT_FILE_PATH \ --top_n 10 --llama3 --zero_shot3.5 完整参数说明README Details of configurations 一节与 run.py 的 argparse 定义共同给出以下参数下表在官方说明基础上补充了源码中确认的默认值与行为参数类型/默认值说明--top_nint默认10每一步生成时喂给 LM 的段落数多论文任务默认 10--feedbackflag生成过程中启用自反馈循环--posthoc_atCLI 简写--posthocflag生成后运行后置引用归因post-hoc citation attributions--zero_shotflag以 zero-shot 方式推理不注入 demonstration--ranking_ceflag启用 cross-encoder 重排不启用则直接取输入文件中ctxs的前top_n条--rerankerstr重排模型路径本地或 Hugging Face Hub官方模型为OpenScholar/OpenScholar_Reranker--min_citationint默认None最低引用数过滤给定整数时引用数低于该值的论文段落被排除--norm_citeflag重排分数中加入归一化引用数加权见 3.6 节--ss_retrieverflag在反馈生成循环中调用 Semantic Scholar API 增补检索--use_abstractflag重排时让论文摘要参与打分文本--max_per_paperint默认None推理时每篇论文最多贡献的段落数--task_namestr默认default单论文任务的任务名SciFact 为claim_fullPubmedQA 为boolean_question_fullQASA 为single_qadefault表示多论文 QA--max_tokensint默认3000主生成阶段的最大生成长度--use_contextsflag使用 RAG 管线时设为 True--api/--api_key_fpstr专有模型 API 提供商及密钥文件路径--download_dirstr默认./cache模型下载缓存目录--datasetstr直接从 Hugging Face datasets 加载测试集--sample_k/--start_indexint随机采样条数 / 断点续跑的起始位置此外 run.py 实现了断点续跑若输出文件已存在会读取其中已有结果并跳过对应前缀数据run.py 每处理 10 条落盘一次并在结束时输出平均 API 成本美元与平均查询延迟秒。成本核算基于 src/open_scholar.py 中内置的 OpenAI 各模型百万 token 单价表如gpt-4o输入 2.50、输出 10.00以空格切分的词数近似 token 数计算。四、管线内部机制从源码看各阶段的真实调用链OpenScholar.runsrc/open_scholar.py是整条管线的调度中心其执行顺序与命令行参数的对应关系如下4.1 Cross-encoder 重排与引用数加权启用--ranking_ce后reranking_passages_cross_encodersrc/open_scholar.py先执行min_citation过滤若citation_counts达到阈值的段落数超过top_n则只保留达标段落。随后调用rerank_paragraphs_bgesrc/open_scholar.py打分文本构造有--use_abstract时拼接为title \n abstract \n text否则为title text调用reranker.compute_score([[query, p] for p in paragraph_texts], batch_size100)得到 cross-encoder 分数若同时启用--norm_cite且段落带citation_counts字段则把citation_counts / max_citations加到重排分数上src/open_scholar.py即高被引论文获得更高的综合排名这正是官方配置中--norm_cite的作用。4.2 每论文段落数上限max_per_papermax_per_paper在run内以标题为键计数实现src/open_scholar.py同一title出现次数超过上限的段落被丢弃避免上下文被单篇论文占据。4.3 生成与提示词模板generate_responsesrc/open_scholar.py负责拼装最终提示把前top_n个段落格式化为[i] Title: ... Text: ...然后按task_name与zero_shot组合选择不同的模板这些模板全部集中在 src/instructions.pydefault多论文综述 QAgeneration_instance_prompts_w_referencesfew-shot含一个完整示例回答或generation_instance_prompts_w_references_zero_shotsingle_qaQASA 单论文 QAgeneration_instance_prompts_w_references_single_paper*summarizationprompts_w_references_summarization*SciFact / PubmedQAtask_instructions字典中的claim_full/boolean_question_fullsrc/instructions.py要求模型给出 true/falseyes/no标签及支持引用编号。所有模板都要求答案用[Response_Start]/[Response_End]标记包裹generate_response末尾按标记截取正文并截断References:之后的内容。若--llama3生效Llama-3 in args.model_name or args.llama3还会经create_prompt_with_llama3_formatsrc/open_scholar.py包裹 Llama 3 的 system/user/assistant chat 头其 system 消息为 You are a helpful AI assistant for scientific literature review...。本地模型以temperature0.7、stop_token_ids[128009]采样API 模型同样temperature0.7。4.4 自反馈循环feedback loop设置--feedback后管线进入迭代精化get_feedbacksrc/open_scholar.py用 src/instructions.py 的feedback_example_instance_prompt让模型对当前答案提出至多 3 条反馈feedbacks[:3]。若反馈仅涉及风格/组织问题则无附带动作问题无动作问题的反馈走edit_with_feedbacksrc/instructions.py 的editing_instance_prompt只修改反馈指出的部分用既有 References 支持新增讨论带动作问题的反馈走检索增补路径retrieve_keywordssrc/open_scholar.py先让模型把问题转成至多 3 条简短搜索查询随后在ss_retrieverTrue时对每个查询调用 src/use_search_apis.py 的search_paper_via_query——该函数请求 Semantic Scholar/paper/search端点固定minCitationCount: 10与sort: citationCount:desc即只取高被引论文的摘要结果按paperId去重后经reranking_passages_cross_encoder_supplementalsrc/open_scholar.py重排最终由edit_with_feedback_retrievalsrc/instructions.py 模板把新段落编号接续原ctxs长度融入修订答案修订答案必须满足长度保护新答案长度需达到原答案的 90% 以上才接受src/open_scholar.py否则丢弃并打印 skipping as edited answers got too short防止模型把答案越改越短。4.5 后置引用校验post-hoc attribution--posthoc_at触发insert_attributions_posthoc_paragraph_allsrc/open_scholar.py按换行将答案切成段落对每一段使用 src/instructions.py 的posthoc_attributions_paragraph_all模板让模型找出段内所有值得引用但缺引用的陈述句仅当某段落能被 References 中某条证据完全支持时才插入编号支持不足则保持原句不动。这构成 OpenScholar 的Citation Verification环节保证最终输出中每条引用都有出处支撑。五、训练基于改造版 torchtune 复现 OpenScholar-8BREADME Training 一节说明官方用 13k 条指令数据OpenScholar 训练数据集在其改造版 torchtune 上训练 Llama 3.1 8B 底座硬件为 8×A100。training/ 目录是完整可运行的 torchtune 分支其 training/README.md 给出了模型支持、内存占用表与全部 recipe。对照 training/recipes/configs/llama3_1/8B_full.yaml 等多机配置复现 8×A100 全参微调的入口命令为tune run --nproc_per_node 8 full_finetune_distributed --config llama3_1/8B_full该目录同时保留了 Llama3.1 的单卡配置8B_full_single_device、8B_lora_single_device、8B_qlora_single_device等见 training/recipes/configs/llama3_1/并支持命令行覆盖配置项如batch_size8 enable_activation_checkpointingTrue与tune cp复制配置后本地修改两种定制方式。模型权重需先经tune download meta-llama/Meta-Llama-3-8B下载并配置 Hugging Face token。六、运行 RetrieverpeS2o 索引的构建、离线检索与在线服务README Run Retriever 一节指出peS2o v2 与 v3 两版数据集chunked text index均已发布OpenScholar-DataStore-V2 / OpenScholar-DataStore-V3。由于索引规模庞大基于 4500 万篇论文、2 亿以上 embeddingpeS2o 检索器需要大量 CPU 内存官方主实验中初始段落是离线检索得到的。具体操作见 retriever/README.md6.1 环境cd retriever conda env create -f environment.yml conda activate scalingretriever/environment.yml 基于 Python 3.11依赖torch、faiss-gpu1.8.0pip 侧安装omegaconf、hydra-core、transformers、sentence_transformers、pyserini、datasketch——对应FAISS 向量索引 词法检索 MinHash 去重的检索栈。6.2 构建索引先将 peS2o v3 数据转换为 JSONL 并放置到指定目录然后分片并行构建官方推荐 SLURM 数组任务datastore_raw_data_path$PES2O_V3_JSONL_DIR # 转换后的 jsonl 目录 num_shards16 for SLURM_ARRAY_TASK_ID in {0..15}; do PYTHONPATH. python ric/main_ric.py \ --config-namepes2o_v3 \ tasks.datastore.embeddingtrue \ tasks.datastore.indextrue \ datastore.raw_data_path$datastore_raw_data_path \ datastore.embedding.num_shards$num_shards \ datastore.embedding.shard_ids[$SLURM_ARRAY_TASK_ID] \ hydra.job_logging.handlers.file.filenameembedding.log done对照 retriever/ric/conf/pes2o_v3.yaml 可以理解该命令背后加载的默认配置v3 索引使用akariasai/pes2o_contriever作为 datastore/query 两侧的 tokenizer 与编码器chunk_size: 256表示以 256 个词为一个段落块datastore.embedding.num_shards: 16与命令行分片一致索引侧默认index_type: PQn_subquantizers: 0时退化为 flat 索引、projection_size: 768、indexing_batch_size: 1000000datastore_root_dir指向 embedding 与 index 的落盘根目录实际部署时需覆盖。6.3 离线检索准备以query为键的 JSONL 查询文件如{query: Text used as a retrieval query, ...}随后EVAL_DOMAIN$EXP_ID RAW_QUERY$PATH_TO_QUERY_JSONL_FILE DS_NAMEpes2o_v3 NUM_SHARDS16 N_DOCS100 index_list[[0] for (( i1; i$((NUM_SHARDS - 1)); i )); do index_list,[$i] done index_list] PYTHONPATH. python ric/main_ric.py \ --config-name pes2o_v3 \ tasks.eval.task_namelm-eval \ tasks.eval.searchtrue \ datastore.embedding.num_shards$NUM_SHARDS \ datastore.embedding.shard_ids[] \ datastore.index.index_shard_ids$index_list \ evaluation.domain$EVAL_DOMAIN \ evaluation.data.eval_data$RAW_QUERY \ evaluation.search.n_docs$N_DOCS \ evaluation.eval_output_dir$EVAL_OUTPUT_DIR其中index_shard_ids逐分片列出全部 16 个索引[[0],[1],...,[15]]n_docs控制每个查询召回的段落数retriever/ric/conf/pes2o_v3.yaml 中evaluation.search.n_docs默认为 1此处显式覆盖为 100merge_multi_index_results: true保证多分片结果合并。检索实现位于 retriever/src/search.pyembed_queriesretriever/src/search.py支持 Contriever 类编码器逐批编码查询per_gpu_batch_size、question_maxlength: 512可选词法归一化与查询 embedding 缓存。6.4 在线 API 服务cd retriever/api python serve_pes2o.py服务由 retriever/api/serve_pes2o.py 提供Flask 应用监听 5005 端口/search为 POST 端点接收{query: ..., domains: pes2o, n_docs: N}。实现上用一个SearchQueue线程 互斥锁把并发请求串行化同一时刻只有一个检索在内存中执行其余排队等待另有/current_search与/queue_size端点查询状态。其配置加载自 retriever/api/conf/pes2o.yamlHydra composepes2o配置名该默认配置以facebook/contriever-msmarco为编码模型、8 分片、同样 256 词分块与 PQ 索引生产部署时替换其中的编码器与数据目录即可。客户端调用示例curl -X POST localhost:FORWARD_PORT/search -H Content-Type: application/json -d {query: example query, domains: pes2o}注意 retriever/README.md 中的服务脚本路径写作retrieval-scaling/api/在当前仓库中实际对应 retriever/api/serve_pes2o.py。托管好该服务后把 src/use_search_apis.py 中的PES2O_INDEX_URL指向该地址即可让run.py的反馈循环直接消费 peS2o 检索结果。七、引用方式若在你的研究中使用 OpenScholarREADME 给出的 BibTeX 为article{openscholar, title{{OpenScholar}: Synthesizing Scientific Literature with Retrieval-Augmented Language Models}, author{Asai, Akari and He*, Jacqueline and Shao*, Rulin and Shi, Weijia and Singh, Amanpreet and Chang, Joseph Chee and Lo, Kyle and Soldaini, Luca and Feldman, Tian, Sergey and Mike, D’arcy and Wadden, David and Latzke, Matt and Minyang and Ji, Pan and Liu, Shengyan and Tong, Hao and Wu, Bohao and Xiong, Yanyu and Zettlemoyer, Luke and Weld, Dan and Neubig, Graham and Downey, Doug and Yih, Wen-tau and Koh, Pang Wei and Hajishirzi, Hannaneh}, journal{Arxiv}, year{2024}, }综合来看本仓库提供了一条可直接跑通的科研综述生成链路以 retriever/ 产出的离线 peS2o 检索结果或官方发布的检索结果文件为初始上下文经 cross-encoder 重排可选引用数加权与摘要增强→ 带引用的 RAG 生成 → 自反馈精化可选 Semantic Scholar 高被引论文增补→ 后置引用校验最终输出结构化的综述回答。理解 run.py 的参数组合与 src/open_scholar.py 中OpenScholar.run的阶段化调用是复现和扩展如更换检索源、更换底座 LM 或调整反馈轮数该管线的关键起点。赞分享人工智能RAGNLP微调模型推理服务【免费下载链接】OpenScholarThis repository includes the official implementation of OpenScholar: Synthesizing Scientific Literature with Retrieval-augmented LMs.项目地址https://gitcode.com/gh_mirrors/op/OpenScholar点击查看免费下载相关推荐ChatPaper 文献调研神器auto_survey基于 GPT 自动检索论文、生成 LaTeX/Markdown 综述的完整指南ChatPaper 文献调研神器auto_survey基于 GPT 自动检索论文、生成 LaTeX/Markdown 综述的完整指南 本篇技术指南围绕 CAI 应用大模型人工智能litgpt科研助手文献综述与实验设计litgpt科研助手文献综述与实验设计 引言AI驱动的科研范式革新 你是否还在为海量文献筛选耗时费力而困扰是否因实验设计参数调优复杂而却步本文将系统介绍大模型预训练微调模型推理服务phantom工作原理从UDP广播到数据包代理的完整技术揭秘phantom工作原理从UDP广播到数据包代理的完整技术揭秘 phantom是一款能够让你将自己的Minecraft服务器与Xbox或PS4/5主机连接并与朋创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑