资讯详情

资讯详情

CrewAI ArxivPaperTool 实战指南:检索 arXiv 论文元数据并批量下载 PDF 的完整实现解析

CrewAI ArxivPaperTool 实战指南检索 arXiv 论文元数据并批量下载 PDF 的完整实现解析【免费下载链接】crewAIFramework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks.项目地址: https://gitcode.com/GitHub_Trending/cr/crewAI本文基于 CrewAI 仓库中ArxivPaperTool的官方文档与源码完整讲解该工具的参数体系、五种典型调用方式、底层 API 请求与 Atom XML 解析链路以及将其接入 Agent/Task 组成自动化文献综述流水线的实战方案。读完本文你可以直接复制可运行代码完成论文检索与 PDF 下载并理解其文件名清洗、摘要截断、限速与错误处理等实现细节。一、ArxivPaperTool 是什么ArxivPaperTool是 CrewAI 工具包crewai-tools中内置的学术文献工具它通过 arXiv 公开 API 检索论文可选下载 PDF并输出结构化的元数据摘要。官方文档README.md对其定位描述为接受一个搜索查询search query从 arXiv 检索论文列表可配置最大返回条数可选下载匹配论文的 PDF可指定 PDF 文件名使用arXiv ID还是论文标题清洗后下载文件保存到自定义或默认目录返回所有论文的结构化摘要含元数据。从源码结构看arxiv_paper_tool.py该工具继承自crewai.tools.BaseTool无任何环境变量的 API Key 要求env_vars默认为空列表仅依赖pydantic见 tool.specs.json 中该工具的package_dependencies与env_vars: []声明属于零配置、开箱即用的离线数据获取工具适合研究人员、学生、学术型 Agent 以及自动文献综述类应用。二、参数体系运行参数与初始化参数该工具的参数分为两层运行参数每次_run调用时传入由 Pydantic 模型ArxivToolInput校验和初始化参数构造工具实例时设置控制下载行为。2.1 运行参数_run 入参参数类型必填说明默认值 / 约束search_querystr是搜索查询字符串如transformer neural network—max_resultsint是*抓取结果数量默认5取值范围1~100源码中Field(5, ge1, le100)* 从 源码定义 看ArxivToolInput中max_results带有默认值5因此省略时会取 5官方参数表中标记为必填指 LLM 调用工具时应显式提供。该约束在 tool.specs.json 生成的run_params_schema中同样体现为minimum: 1, maximum: 100, default: 5。2.2 初始化参数构造参数参数类型默认值说明download_pdfsboolFalse是否下载匹配论文的 PDFsave_dirstr./arxiv_pdfsPDF 保存目录不存在时自动创建mkdir(parentsTrue, exist_okTrue)use_title_as_filenameboolFalse是否用清洗后的论文标题作为文件名否则用 arXiv ID对应源码字段位于 arxiv_paper_tool.py#L27-L41。工具还声明了固定的nameArxiv Paper Fetcher and Downloader与description这两个字段正是 LLM 决定何时调用该工具的依据。三、五种典型用法可复制示例以下示例全部来自官方文档 README.md保持原样可运行。3.1 初始化from crewai_tools import ArxivPaperTool3.2 用法 1仅获取元数据不下载tool ArxivPaperTool() result tool._run( search_querydeep learning, max_results1 ) print(result)3.3 用法 2获取并下载 PDFarXiv ID 作文件名tool ArxivPaperTool(download_pdfsTrue) result tool._run( search_querytransformer models, max_results2 ) print(result)3.4 用法 3下载到自定义目录tool ArxivPaperTool( download_pdfsTrue, save_dir./my_papers ) result tool._run( search_querygraph neural networks, max_results2 ) print(result)3.5 用法 4用论文标题作文件名tool ArxivPaperTool( download_pdfsTrue, use_title_as_filenameTrue ) result tool._run( search_queryvision transformers, max_results1 ) print(result)3.6 用法 5全部选项组合tool ArxivPaperTool( download_pdfsTrue, save_dir./downloads, use_title_as_filenameTrue ) result tool._run( search_querystable diffusion, max_results3 ) print(result)3.7 通过__main__直接运行if __name__ __main__: tool ArxivPaperTool( download_pdfsTrue, save_dir./downloads2, use_title_as_filenameFalse ) result tool._run( search_querydeep learning, max_results1 ) print(result)注意直接脚本调用时使用的是内部方法_run返回格式化字符串。当工具交给 Agent 调用时框架会按其args_schema即ArxivToolInput自动组装search_query与max_results两个参数LLM 无需关心下载配置——下载行为完全由初始化参数决定。四、源码级实现解析从请求到落盘4.1 执行主流程_run_run 方法 的处理链路为用ArxivToolInput校验入参max_results越界会直接触发 Pydantic 校验错误调用fetch_arxiv_data拉取论文列表若download_pdfsTrue先经_validate_save_path解析并创建保存目录再逐篇处理——按use_title_as_filename决定文件名基标题分支会执行re.sub(r[\\/*?:|], _, title)清洗非法字符清洗后为空则回退到 arXiv ID文件名再统一截断到500 字符filename_base[:500]并拼接.pdf后缀每下载一篇执行time.sleep(self.SLEEP_DURATION)SLEEP_DURATION 1秒对 arXiv 服务器限速避免触发限流最终将所有论文经_format_paper_result格式化以 80 个-分隔线拼接成单个字符串返回任意异常都会被捕获并返回Failed to fetch or download Arxiv papers: ...的友好文本而不是向上抛出——这一点在测试test_run_handles_exception中得到验证。4.2 arXiv API 请求与 Atom XML 解析fetch_arxiv_data 的关键实现API 端点类变量BASE_API_URL http://export.arxiv.org/api/query请求形如?search_query{URL编码查询}start0max_results{n}超时REQUEST_TIMEOUT 10秒非 200 状态直接抛出 HTTP 错误命名空间Atom 命名空间{http://www.w3.org/2005/Atom}逐个解析entry字段提取id取最后一段路径并将.替换为_作为arxiv_id、title、summary、published、author/name列表以及 PDF 链接PDF 链接提取_extract_pdf_url优先取link titlepdf href...找不到时回退为任意href中含pdf的链接再找不到返回None对应论文不下载输出中显示PDF: N/A。每篇论文最终聚合为如下结构的字典arxiv_id、title、summary、authors、published_date、pdf_url。4.3 输出格式与摘要截断_format_paper_result 将每篇论文格式化为固定五段Title: {标题} Authors: {作者1, 作者2, ...} Published: {发布日期} PDF: {pdf_url 或 N/A} Summary: {摘要超过 300 字符时截断并追加 ...}摘要截断长度由类变量SUMMARY_TRUNCATE_LENGTH 300控制。这个设计值得注意_run返回的是纯文本而非 JSON目的是控制喂给 LLM 的 token 量——LLM 拿到的是紧凑的元数据摘要而非原始 XML 或全文。4.4 目录校验与下载错误处理_validate_save_path 对路径执行Path(path).resolve()后再mkdir(parentsTrue, exist_okTrue)测试test_validate_save_path_creates_directory确认其按预期调用download_pdf 使用urllib.request.urlretrieve落盘网络错误URLError与文件写入错误OSError分别记录日志并向上抛出由_run顶层统一兜底。五、测试用例印证的行为边界单元测试文件 arxiv_paper_tool_test.py 覆盖了该工具的关键行为可作为实现事实参考test_fetch_arxiv_datamock 一个最小 Atom feed验证标题解析正确test_fetch_arxiv_data_network_errorurllib.error.URLError会向上传播test_download_pdf_success/test_download_pdf_oserror下载成功时调用一次urlretrieve磁盘写入失败时OSError上抛test_run_with_downloaddownload_pdfsTrue时_run输出包含Title: Sample Paper且下载恰好执行一次test_run_no_download默认不触发下载test_run_handles_exceptionAPI 失败时_run返回Failed to fetch or download Arxiv papers前缀文本test_invalid_xml_response非法 XML 使fetch_arxiv_data抛出ET.ParseError注意该异常发生在fetch_arxiv_data内部且测试直接调用该方法_run顶层会将其兜底为失败文本test_run_with_max_results一次 mock 100 条论文验证输出中恰好出现 100 个Title:印证max_results上限 100 的可用性。六、进阶接入 Agent 组成自动文献检索流水线同目录下的 Examples.md 给出了将该工具交给 CrewAI Agent 的完整范例单个Agent 单个Task 顺序Crew让 Agent 依据研究主题自主调用工具检索并下载论文。核心代码原文使用本地 Ollama 模型可按需替换为任意受支持的 LLMfrom crewai import Agent, Task, Crew, Process, LLM from crewai_tools import ArxivPaperTool llm LLM( modelollama/llama3.1, base_urlhttp://localhost:11434, temperature0.1 ) topic Crew AI max_results 3 save_dir ./DOWNLOADS use_title_as_filename True tool ArxivPaperTool( download_pdfsTrue, save_dirsave_dir, use_title_as_filenameTrue ) tool.result_as_answer True # Required, otherwise arxiv_paper_fetch Agent( roleArxiv Data Fetcher, goalfRetrieve relevant papers from arXiv based on a research topic {topic} and maximum number of papers to be downloaded is{max_results},try to use title as filename {use_title_as_filename} and download PDFs to {save_dir},, backstoryAn expert in scientific data retrieval, skilled in extracting academic content from arXiv., llmllm, verboseTrue, allow_delegationFalse ) fetch_task Task( description( fSearch arXiv for the topic {topic} and fetch up to {max_results} papers. fDownload PDFs for analysis and store them at {save_dir}. ), expected_outputPDFs saved to disk for downstream agents., agentarxiv_paper_fetch, tools[tool], ) pdf_qa_crew Crew( agents[arxiv_paper_fetch], tasks[fetch_task], processProcess.sequential, verboseTrue, ) result pdf_qa_crew.kickoff() print(f\nAnswer:\n\n{result.raw}\n)示例文档特别强调了tool.result_as_answer True的设置。从crewai核心源码可以印证其机制Agent 执行器在收集工具结果时见 agent_executor 相关处理 与 utils 中的结果处理会检查工具是否标记了result_as_answer命中后把该工具输出直接作为任务最终答案返回跳过后续推理迭代。对检索 下载这类任务工具文本输出本身即是期望产物因此该标记能省去一轮 LLM 总结。示例文档还指出落盘的 PDF 可继续喂给下游任务典型方向包括RAG检索增强生成、摘要生成、引用提取、基于嵌入的检索与分析——这构成了ArxivPaperTool 取料 → 下游 Agent 加工的自动化文献综述骨架。七、适用前提与限制结合文档与源码使用该工具时需注意以下边界网络依赖工具需要能够访问 arXiv 公开 APIexport.arxiv.org无代理环境需自行配置网络请求超时固定为 10 秒类变量不可通过初始化参数覆盖从源码结构看如需调整须改代码或子类化批量上限max_results被 Pydantic 硬性约束在1~100下载限速每篇 PDF 之间固定 sleep 1 秒下载大批量论文时总耗时线性增长文件名策略无论 arXiv ID 还是标题模式文件名都被截断至 500 字符标题模式只清洗[\\/*?:|]字符未做跨平台如 Windows 保留名处理摘要截断返回摘要固定截断到 300 字符若下游需要完整摘要应基于返回的 PDF URL 自行抓取原文错误兜底_run内部捕获异常并返回失败文本Agent 场景下表现为拿到一段错误描述脚本场景下需自行检查返回文本前缀。八、相关文件索引工具文档本文主体来源README.mdAgent 集成示例Examples.md核心实现arxiv_paper_tool.py单元测试arxiv_paper_tool_test.py工具 Schema 声明参数默认值与运行参数约束tool.specs.json包导出crewai_tools/init.py【免费下载链接】crewAIFramework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks.项目地址: https://gitcode.com/GitHub_Trending/cr/crewAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →