前言
这两天mauns很火,它整合了现有大模型和各种工具,实现将各种指令的整合落实。比如,现在用户问DeepSeek一个问题,它只会告诉用户具体怎么去做,而mauns直接去做,把各种结果和中间文件给到用户,仿佛是一个全能秘书。
尽管mauns看上去的能力很强大,但我仍不看好这个产品,主要原因如下:
-
没有提升基础大模型的性能
与DeepSeek等工作相比,mauns更多是现有产品的整合,并没有从根源上提升基础大模型的性能,像DeepSeek等现有大模型,通常存在“幻觉”问题。mauns需要先将用户的问题,拆成各个串联的具体步骤,如果某个步骤出现差错,访问到垃圾资料,执行错误命令,很可能导致任务失败,甚至系统崩溃。 -
小题大做,浪费资源
看了现有的一些演示demo,发现一个潜在的问题。有时用户只需要一个简单的答案,mauns会将回答制作成一个网页给用户。。存在小题大做的嫌疑。 -
输出时间/价格问题
由于mauns会把一个任务拆解成各种子问题,因此回答输出本身就需要较长时间。其次,如果mauns如果按照现有LLM根据输入/输出token进行收费,可能会造成费用过高,成本不可控等问题。 -
登录权限问题
虽然mauns可以自主去网上搜集资料。但不少高质量资料的网站需要用户进行登录才能访问,如何解决用户授权问题,mauns并未给出明确的解决方案。如果能通过用户扫码授权,是否会做出违背用户意愿的危险操作,比如发帖、支付等操作,存在一定隐患。 -
开源问题
紧接上一条,正因为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/*