使用通义千问Qwen技术构建一个ChatPDF AI助手。这个助手允许用户上传PDF文件,并基于文件内容与用户进行对话。我们将使用Python和相关的库来实现这个助手。
我们使用了以下几种技术:
Streamlit:这是一个开源的Python库,允许开发者快速构建和部署数据应用。它非常适合于创建原型和简单的Web应用,无需前端知识。
OpenAI API:这是OpenAI提供的API服务,允许开发者利用OpenAI的模型进行各种自然语言处理任务。在这个案例中,我们使用它来上传PDF文件并获取文件ID。
Transformers:这是Hugging Face提供的Python库,提供了大量预训练模型和工具,用于处理自然语言。在这个案例中,我们使用它来加载和运行Qwen模型。
Tiktoken:这是一个用于计数和分割tokens的库,它是基于OpenAI的GPT-3 tokenization。在这个案例中,我们使用它来计算消息中的tokens数量,以估算使用成本。
.env文件和python-dotenv库:这是用于管理环境变量的工具,允许开发者将敏感信息(如API密钥)存储在.env文件中,而不是直接硬编码在代码中。
使用的是通义千问Qwen:
通义千问Qwen技术是一个强大的自然语言处理框架,它为开发者提供了以下优点:
高效率:Qwen技术能够快速理解和处理复杂的自然语言输入,为用户提供即时响应。
可定制性:开发者可以根据自己的需求调整和优化Qwen模型,以适应不同的应用场景。
多语言支持:Qwen技术支持多种语言,这使得它能够服务于全球用户。
上下文理解:Qwen技术能够理解长篇文档的上下文,这使得它在处理基于文档的对话时表现出色。
易于集成:Qwen技术可以轻松集成到现有的应用和服务中,为它们提供智能对话能力。
成本效益:通过精确的token计数和高效的模型运行,Qwen技术帮助开发者控制成本,同时提供高质量的服务。
在这个ChatPDF AI助手的案例中,通义千问Qwen技术的应用显著提升了用户体验,使得用户能够通过简单的对话获取PDF文件中的信息,极大地提高了信息检索的便捷性和效率。
案例:
本项目利用通义千问Qwen技术构建了一个ChatPDF AI助手,用户可上传PDF文件并基于文件内容进行对话。项目采用Python及多个库实现,包括Streamlit、OpenAI API、Transformers、Tiktoken等,支持高效、可定制的多语言对话,具备上下文理解能力和成本效益。示例代码展示了从环境配置到功能实现的完整流程,适合开发者快速上手。
环境依赖
首先,确保你安装了以下依赖:
pip install transformers>=4.37.0 streamlit openai
代码实现
- 导入必要的库
import streamlit as st import openai import tiktoken from dotenv import load_dotenv import os
- 加载环境变量
load_dotenv() api_key = os.getenv("OPENAI_API_KEY")
- 初始化客户端
openai.api_key = api_key
- 初始化Tiktoken编码器
encoder = tiktoken.encoding.get_encoder("Qwen/Qwen-7B")
- 定义初始化页面和对话消息的函数
def init_page(): st.title("ChatPDF AI 助手") st.sidebar.title("选项") def init_messages(): st.session_state.messages = [] def upload_pdf(): file = st.file_uploader("上传 PDF 文件", type=["pdf"]) if file: file_content = file.read() file_id = openai.File.create(file=file_content).id st.session_state.messages.append({"role": "system", "content": f"上传了文件 {file_id}"}) return file_id return None def select_llm(): st.sidebar.markdown("选择语言模型") model_name = st.sidebar.selectbox("", ["Qwen/Qwen-7B", "Qwen/Qwen-14B"]) return model_name def get_answer(model_name, messages, file_id): system_message = {"role": "system", "content": f"文件 ID: {file_id}"} messages.append(system_message) user_message = st.text_input("输入你的问题:") if user_message: messages.append({"role": "user", "content": user_message}) inputs = tokenizer(user_message, return_tensors="pt") inputs = inputs.to(model.device) pred = model.generate(**inputs) answer = tokenizer.decode(pred.cpu()[0], skip_special_tokens=True) st.session_state.messages.append({"role": "assistant", "content": answer}) def calculate_cost(messages): total_tokens = sum(encoder.encode(msg["content"]).num_tokens for msg in messages) cost_per_k_tokens = 0.02 # 假设每千个 token 的价格为 0.02 美元 total_cost = total_tokens / 1000 * cost_per_k_tokens st.markdown(f"总费用: ${total_cost:.2f}")
- 主函数
def main(): init_page() init_messages() file_id = upload_pdf() model_name = select_llm() model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", trust_remote_code=True).eval() tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) while True: get_answer(model_name, st.session_state.messages, file_id) calculate_cost(st.session_state.messages) if not st.button("继续对话"): break
- 运行应用
if __name__ == "__main__": main()