之前写的Paper-Agent最近做了些重构升级,主要是下面这些变动:
多种大模型的支持
之前是只接入了 deepseek 和 kimi, 并且使用 Kimi 作为pdf问答的关键大模型,但经过使用后发现一个比较头疼的问题,kimi 的api略贵了一点,如果要做完整的论文十问可能要一块多,但官方有个 Context Caching 的功能,可以节约大量的 token 消耗,不过这个我还没有细看,如果想要更多的依赖 kimi 的话,后续有空也许会进行代码实现。
那么为了节约成本,deepseek 目前来看是最便宜的大模型了,因此抽取pdf的工作得交给本地的代码,我使用的是 Pymupdf 进行的文本抽取,效果还可以。
代码本地做了一些整理,之前deepseek和kimi的代码重合度是非常高的,本次定义了一个LLM的基类,根据不同情况制作不同的实现类:
class LLM(ABC):
def __init__(self, model_name: str):
conf = llm_config.get(model_name)
self.model_name = conf['model_name']
self.api_key = conf['api_key']
self.base_url = conf['base_url']
@abstractmethod
def chat(self, message: str, system_prompt: str = "") -> str:
pass
@abstractmethod
def chat_pdf(self, message: str, file_content) -> str:
pass
deepseek 和 kimi 都可以直接使用 OpenAI 的 sdk,因此我将其统一归纳到 OpenAI 类型的 LLM:OpenAiLlm, 另一个LLM的实现是本地的Ollama实现类:OllamaLlm,这样对于本地机器足以运行大模型的同学来说,可以免去使用API的开销。
Kimi 因为有文件管理的能力,因此做了单独的实现类,具体想要用哪个模型就初始化哪一个模型的实例:
current_llm = KimiLlm() if use_kimi else OllamaLlm(‘qwen’) if use_ollama else OpenAiLlm(‘deepseek’)
模型的配置均可以写在 model.py 的 llm_config 中:
llm_config = {
"deepseek": {
"model_name": "deepseek-chat",
"api_key": os.environ.get('DEEPSEEK_KEY'),
"base_url": "https://api.deepseek.com"
},
"kimi": {
"model_name": "moonshot-v1-128k",
"api_key": os.environ.get('KIMI_KEY'),
"base_url": "https://api.moonshot.cn/v1"
},
"qwen": {
"model_name": "qwen2",
'api_key': '不用填',
"base_url": "ollama的地址"
}
}
这里的 deepseek 和 kimi 用的都是api, qwen 使用的是ollama。
其他变动
除了上面的模型变动,页面上额外增加了生成所有以及导出MD两个按钮,可以一键生成所有问题答案(不过也要慢慢等哦),以及导出页面内容的Markdown。
系统prompt以及论文十问的配置在prompt_template.py 中,需要的可以自行进行修改。
此外,有时候大家如果只需要直接根据论文导出Markdown,也可以直接使用这次新增加的 flow.py, 修改里面的论文url后运行即可生成包含论文标题摘要以及QA的Markdown文档,很适合快速了解论文内容使用。
这个项目的更新可能会暂缓了,感觉使用Streamlit的限制还是太多了,而且现在更多的不是paper-agent, 而是arxiv-helper,只能使用arxiv的论文,代码里引入了aminer的接口,但没有实际使用,后续应该要开新坑来做一个Web版本的论文管理平台。
附录:使用Colab部署Ollama并本地使用的方法
我自己的机器不足以运行绝大多数模型,但我经常会使用Colab来进行一些学习和开发,它拿来部署 Ollama 可是绰绰有余,但想要本地使用的话,需要借助一个网站,叫做 Ngrok(https://ngrok.com/) ,相信很多同学可能已经听过了,我们要做的就是将Colab部署的Ollama和它连接起来。
申请好 Ngrok 的账号后,在Dashboard 的 Your Authtoken 菜单可以找到自己的token,将这个token配置到Colab的笔记本中,就是Colab 左侧的钥匙形状的按钮。配置好后就可以通过下面的方式得到token:
from google.colab import userdata
token = userdata.get(‘NGROK_TOKEN’)
接下来就是在Colab上启动 Ollama ,并关联 Ngrok, 代码没什么好解释的,我是在掘金上找到的一篇介绍,然后复制了其中的部分代码进行了简化,笔记本的链接我这里分享出来,大家需要的直接一键执行就可以
大家唯一要修改的大概就是挑选一个自己需要使用的模型,比如这里用的是qwen2:
!ollama pull qwen2
笔记本执行的最后会输出ngrok代理的地址,这个地址就可以直接配置到上面代码的ollama的base_url,然后就能愉快的使用Ollama部署的模型啦。