之前写的Paper-Agent(https://github.com/careywyr/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
defchat(self, message: str, system_prompt: str = "")->str:
pass
@abstractmethod
defchat_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 可是绰绰有余,但想要本地使用的话,需要借助一个网站,叫做 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, 代码没什么好解释的,我是在掘金上找到的一篇介绍,然后复制了其中的部分代码进行了简化,笔记本的链接我这里分享出来,大家需要的直接一键执行就可以:
https://colab.research.google.com/drive/1BW5kvlGuikjBdUqQgpkZF5EdCg7XZLJa?usp=sharing
大家唯一要修改的大概就是挑选一个自己需要使用的模型,比如这里用的是qwen2:
!ollama pull qwen2
笔记本执行的最后会输出ngrok代理的地址,这个地址就可以直接配置到上面代码的ollama的base_url,然后就能愉快的使用Ollama部署的模型啦。
你好,我是叶子,7年Java开发老司机,待过小的创业公司也待过上市厂子。擅长各种姿势的CRUD,但现在工作重心逐渐往中间件开发转移。喜欢折腾技术,AI是个人爱好驱动去学习的。但不管是Java还是AI还是其他非技术行业的知识,我都希望能和大家共同学习进步,如果文章有用,还请大家点击关注,希望我们能一起在技术的道路上走的更远!