大家好!今天我要和大家分享的是如何使用通义千问 Qwen 大模型来构建一个本地的 ChatPDF AI助手。这个助手可以让你上传 PDF 文件,然后基于文件内容和它进行对话,非常方便和有趣,我们不用担心文档数据泄露,个人隐私也可以得到保护。通过部署到云服务器,我们也可以构建一个网站应用。演示如下:
接下来,我会一步一步地带你了解这个项目的实现过程,希望大家能喜欢。
我们需要通过阿里云百炼平台获取大模型API,因为我要构建一个文档对话应用,所以这里我选用的是Qwen-Long这个大模型,Qwen-Long是在通义千问针对超长上下文处理场景的大语言模型,支持最长1000万tokens(约1500万字或1.5万页文档)的超长上下文对话。配合同步上线的文档服务,可支持word、pdf、markdown、epub、mobi等多种文档格式的解析和对话。
首先,我们需要导入一些必要的库和模块。我们主要会用到openai、streamlit和 tiktoken。其中,tiktoken 是用来处理 token 编码的,这样可以帮我们计算对话的费用。
接下来,我们需要加载环境变量。通过 dotenv 模块,我们可以从 .env 文件中加载配置。只要把 .env 文件放在项目的根目录中就可以了。
然后,我们需要初始化客户端。只需获取通义千问大模型的 API 密钥,并用它创建一个客户端实例。如果密钥没有设置好,程序会提醒你。
接下来,我们初始化 tiktoken 的编码器,这个小工具可以帮我们计算消息的 token 数量。
然后我们来定义一些初始化页面和对话消息的函数。init_page 函数设置页面和侧边栏的标题,而 init_messages 函数用来初始化对话消息。
我们还需要一个上传 PDF 文件的函数 upload_pdf。这个函数会把文件上传到 OpenAI 的文件服务,并返回文件的 ID。
然后,我们定义一个选择语言模型的函数 select_llm,从 Streamlit 的侧边栏读取用户选择的模型名称。
接下来是获取 AI 回答的函数 get_answer。这个函数接受模型名称、消息列表和文件 ID 作为参数。首先添加包含文件 ID 的系统消息,然后获取用户的实际问题,调用 OpenAI 的聊天完成接口获取回答,并返回回答内容。
我们还需要一个计算对话费用的函数 calculate_cost。这个函数会计算消息列表中所有消息的 token 数量,然后根据每千个 token 的价格计算总费用。这样你就能知道自己花了多少钱。
最后,我们来看看主函数 main。这个函数会初始化页面和对话消息,处理文件上传,获取用户输入,并显示对话历史和费用。具体流程是先初始化页面,然后选择模型,上传文件,初始化对话消息,获取用户输入,调用 AI 获取回答,计算费用,并显示在页面上。
怎么样?是不是很有意思?你也可以在本地部署一个自己的ChatPDF AI 助手,轻松地和 PDF 文件内容进行对话,再也不用害怕文档数据泄漏,快来动手试试构建吧!