Academicagent v0.1.0:自制科研助理

前言

这两天mauns很火,它整合了现有大模型和各种工具,实现将各种指令的整合落实。比如,现在用户问DeepSeek一个问题,它只会告诉用户具体怎么去做,而mauns直接去做,把各种结果和中间文件给到用户,仿佛是一个全能秘书。

尽管mauns看上去的能力很强大,但我仍不看好这个产品,主要原因如下:

  1. 没有提升基础大模型的性能
    与DeepSeek等工作相比,mauns更多是现有产品的整合,并没有从根源上提升基础大模型的性能,像DeepSeek等现有大模型,通常存在“幻觉”问题。mauns需要先将用户的问题,拆成各个串联的具体步骤,如果某个步骤出现差错,访问到垃圾资料,执行错误命令,很可能导致任务失败,甚至系统崩溃。

  2. 小题大做,浪费资源
    看了现有的一些演示demo,发现一个潜在的问题。有时用户只需要一个简单的答案,mauns会将回答制作成一个网页给用户。。存在小题大做的嫌疑。

  3. 输出时间/价格问题
    由于mauns会把一个任务拆解成各种子问题,因此回答输出本身就需要较长时间。其次,如果mauns如果按照现有LLM根据输入/输出token进行收费,可能会造成费用过高,成本不可控等问题。

  4. 登录权限问题
    虽然mauns可以自主去网上搜集资料。但不少高质量资料的网站需要用户进行登录才能访问,如何解决用户授权问题,mauns并未给出明确的解决方案。如果能通过用户扫码授权,是否会做出违背用户意愿的危险操作,比如发帖、支付等操作,存在一定隐患。

  5. 开源问题
    紧接上一条,正因为mauns在带来方便的同时也存在风险。因此,此类工具如果开源,运行用户本地部署,可减少此类风险担忧。目前,mauns显然未考虑开源,也未开放公众体验渠道,存在一定炒作嫌疑。

虽然mauns存在上述系列问题,但是否可以利用agent的思路,搭建一个流程固定可控的论文筛选助手,帮助科研筛选论文。

基于此构想,我开发了科研助理(Academicagent)。

Academicagent 开源地址:https://github.com/zstar1003/academicagent

Academicagent 安装

Academicagent 是一款Python依赖包,已上传到https://pypi.python.org/simple/

可pip直接进行安装

pip install academicagent

Academicagent 使用

使用以下代码就可直接使用Academicagent:

from academicagent.agent import run_agent

run_agent(paper_keyword="object detection", total_count=1, save_path="papers", model_name="deepseek-r1:1.5b")

输入参数

  • paper_keyword (字符串):
    用于在 arXiv 上搜索论文的关键词。
    示例: "object detection"

  • total_count (整数):
    指定需要下载的论文总数量。
    示例: 5

  • save_path (字符串, 默认 “papers”):
    指定保存下载 PDF 的文件夹路径。若未传入,将默认使用 “papers”。
    示例: "papers"

  • question (字符串, 可选):
    提供给大模型的提问内容;若未指定,则使用默认问题:

    “帮我生成这篇文章的中文摘要,并从新意度、有效性、问题大小三个维度综合评估这篇文章的价值,满分十分,生成完中文摘要后,打出你认为的评分。”

  • model_name (字符串, 默认 “deepseek-r1:1.5b”):
    本地大模型的名称,用于 Ollama 的模型调用。

输出

  • PDF 下载:
    根据指定关键词和数量,从 arXiv 下载论文 PDF 文件到指定的 save_path 文件夹中。

  • 评估文件:
    所有论文的标题和大模型回答会写入一个 Markdown 文件,文件名格式为 论文质量评估YYYYMMDD.md(如 论文质量评估20250307.md),用于记录每篇论文的中文摘要和综合评分。

输出评估文件示例如下:

在这里插入图片描述

常见问题解答:

1. academicagent 的目的是解决什么问题?

academicagent 用来自动在arxiv网站上根据预设主题下载论文,并根据论文摘要对论文进行评分,如同一个科研助理,提前帮助科研人员筛选一遍文献,提升效率,节省时间。

2. 如何评估论文价值?

目前默认的prompt模板参考了李沐老师的论文价值评估法,从新意度、有效性、问题大小三个角度对论文进行综合评估。

3. 为什么起了这么长的名字?

PyPI的包名不允许重名,原本想叫“paperagent”,遇到重名问题,只能取长名避免。

4. 后续是否考虑维护开发?

目前仅解决个人的临时痛点,将综合各种情况,考虑继续落实一些有趣想法。如有意见/建议,可留言讨论。

技术细节

1. 论文下载

目前仅支持arxiv平台,通过其search接口进行数据访问。可通过以下脚本下载论文:

import os
import requests
import re
import math
import time
import warnings
from lxml import html
from bs4 import BeautifulSoup


warnings.filterwarnings("ignore")


def get_total_results(url):
    """获取总结果数"""
    response = requests.get(url)
    tree = html.fromstring(response.content)
    result_string = ''.join(tree.xpath('//*[@id="main-container"]/div[1]/div[1]/h1/text()')).strip()
    match = re.search(r'of ([\d,]+) results', result_string)
    if match:
        total_results = int(match.group(1).replace(',', ''))
        return total_results
    else:
        print("没有找到匹配的数字。")
        return 0


# 下载文章和代码到相应的文件夹
def download_file(url, folder, filename):
    filepath = os.path.join(folder, filename)
    if os.path.exists(filepath):
        print(f"文件已存在,跳过下载: {filename}")
        return True
    try:
        print(f"开始下载: {url}")  # 增加调试信息
        response = requests.get(url)
        response.raise_for_status()
        filepath = os.path.join(folder, filename)
        with open(filepath, 'wb') as f:
            f.write(response.content)
        print(f"成功下载: {filename}\n")
        return True
    except requests.exceptions.RequestException as e:
        print(f"下载失败: {url}, 错误: {e}\n")
    except IOError as e:
        print(f"文件保存失败: {filename}, 错误: {e}\n")
    return False

def get_paper_info(url, save_path):
    """根据URL爬取一页的论文信息"""
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    papers = []

    for article in soup.find_all('li', class_='arxiv-result'):
        title = article.find('p', class_='title').text.strip()
        authors_text = article.find('p', class_='authors').text.replace('Authors:', '').strip()
        authors = [author.strip() for author in authors_text.split(',')]
        abstract = article.find('span', class_='abstract-full').text.strip()
        submitted = article.find('p', class_='is-size-7').text.strip()
        submission_date = submitted.split(';')[0].replace('Submitted', '').strip()
        pdf_link_element = article.find('a', text='pdf')
        if pdf_link_element:
            pdf_link = pdf_link_element['href']
        else:
            pdf_link = 'No PDF link found'
        print(title, ":", pdf_link)
        filename = re.sub(r'[\/:*?"<>|]', '_', title) + ".pdf"  # 处理非法文件名
        download_success = download_file(pdf_link, save_path, filename)
        if not download_success:
            print(f"论文 {title} 的 PDF 下载失败,跳过")
            continue
        time.sleep(1)
    return papers


# 主程序
if __name__ == '__main__':
    save_path = "pdfs"
    base_url ="https://arxiv.org/search/?query=object+detect&searchtype=abstract&abstracts=show&order=-announced_date_first&size=50"
    os.makedirs(save_path, exist_ok=True)
    total_results = get_total_results(base_url + "&start=0")
    pages = math.ceil(total_results / 50)
    all_papers = []

    for page in range(pages):
        start = page * 50
        print(f"Crawling page {page + 1}/{pages}, start={start}")
        page_url = base_url + f"&start={start}"
        all_papers.extend(get_paper_info(page_url, save_path=save_path))
        time.sleep(3)  # 等待三秒以避免对服务器造成过大压力

    print(f"完成!总共爬取到 {len(all_papers)} 条数据。")

2. PDF论文解析

通过PyMuPDF实现论文解析,示例代码:

from langchain_community.document_loaders import PyMuPDFLoader

def load_pdf(file_path):
    """使用 LangChain 解析 PDF 文件"""
    loader = PyMuPDFLoader(file_path)
    documents = loader.load()
    return documents

pdf_path = "pdfs/DEAL-YOLO_ Drone-based Efficient Animal Localization using YOLO.pdf"
docs = load_pdf(pdf_path)

# 输出内容
print(docs[1].page_content[:10000])

3. Ollama模型交互

考虑到模型无法容纳过多的上下文,因此,这里仅选取前几页文本输入进模型,示例代码:

from langchain_ollama import OllamaLLM
from langchain_community.document_loaders import PyMuPDFLoader

# 连接本地 Ollama
llm = OllamaLLM(model="deepseek-r1:1.5b")

def ask_ollama(query, context):
    """将 PDF 内容作为上下文,并向 Ollama 提问"""
    prompt = f"以下是文档内容的一部分:\n\n{context}\n\n基于此内容,请回答:{query}"
    response = llm.invoke(prompt)
    return response

def load_pdf(file_path):
    """使用 LangChain 解析 PDF 文件"""
    loader = PyMuPDFLoader(file_path)
    documents = loader.load()
    return documents

pdf_path = "pdfs/DEAL-YOLO_ Drone-based Efficient Animal Localization using YOLO.pdf"
docs = load_pdf(pdf_path)

# 读取PDF前几页的文本
pdf_text = "\n".join([doc.page_content for doc in docs[:1]]) 

# 提问 Ollama
question = "这篇论文的主要结论是什么?"
answer = ask_ollama(question, pdf_text)

print("Ollama 的回答:", answer)

4. PyPI打包上传

将自己的python包打包上传到PyPI,供他人下载使用。
首先须在PyPI官网注册账号,获取Token,在C:\Users\%Username$路径下创建.pypirc文件,内容如下:

[distutils]
index-servers=pypi
 
[pypi]
repository = https://upload.pypi.org/legacy/
username = __token__
password = 自己的token

之后安装twine

pip install twine

在项目路径下,创建setup.py文件:

from setuptools import setup, find_packages

setup(
    name='academicagent',
    version='0.1.0',
    author='zstar',
    author_email='zstar1003@163.com',
    description='A package to download arXiv papers and interact with PDFs using Ollama LLM',
    long_description=open('README.md', encoding='utf-8').read(),
    long_description_content_type='text/markdown',
    url='https://github.com/zstar1003/papaeragent',
    packages=find_packages(),
    install_requires=[
        'requests',
        'lxml',
        'beautifulsoup4',
        'langchain_ollama',
        'langchain_community',
        'PyMuPDF',
    ],
    classifiers=[
        'Programming Language :: Python :: 3',
        'License :: OSI Approved :: MIT License',
        'Operating System :: OS Independent',
    ],
    python_requires='>=3.6',
)

根目录下,执行打包:

python setup.py sdist bdist_wheel

上传内容:

twine upload dist/*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zstar-_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值