Qwen1.5-1.8B-GPTQ-Int4保姆级教程:Chainlit前端集成文档上传与RAG知识库构建

1. 环境准备与快速部署

在开始之前,我们需要确保系统环境满足基本要求。这个教程假设你已经完成了基础环境的搭建,包括Python环境和必要的依赖库。

1.1 系统要求

  • Python 3.8或更高版本
  • 至少8GB可用内存
  • 支持CUDA的NVIDIA GPU(推荐)

1.2 安装依赖

首先,我们需要安装必要的Python包。创建一个新的虚拟环境是个好习惯:

python -m venv qwen_env
source qwen_env/bin/activate  # Linux/Mac
# 或者 qwen_env\Scripts\activate  # Windows

然后安装核心依赖:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install vllm chainlit transformers

2. 模型部署与验证

2.1 使用vLLM部署模型

vLLM是一个高效的推理引擎,特别适合部署大型语言模型。我们可以用它来部署Qwen1.5-1.8B-Chat-GPTQ-Int4模型:

python -m vllm.entrypoints.api_server \
    --model Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4 \
    --quantization gptq \
    --dtype auto \
    --gpu-memory-utilization 0.9

2.2 验证模型服务

部署成功后,我们可以通过简单的API调用来验证服务是否正常运行:

import requests

response = requests.post(
    "http://localhost:8000/v1/completions",
    json={
        "model": "Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4",
        "prompt": "介绍一下你自己",
        "max_tokens": 100
    }
)
print(response.json()["choices"][0]["text"])

如果看到模型返回了自我介绍,说明部署成功。

3. Chainlit前端集成

Chainlit是一个强大的工具,可以快速为LLM应用构建交互式界面。我们将使用它来创建一个用户友好的前端。

3.1 创建基础Chainlit应用

创建一个名为app.py的文件,添加以下内容:

import chainlit as cl
from vllm import LLM, SamplingParams

@cl.on_chat_start
async def start_chat():
    llm = LLM(model="Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4", quantization="gptq")
    cl.user_session.set("llm", llm)

@cl.on_message
async def main(message: cl.Message):
    llm = cl.user_session.get("llm")
    sampling_params = SamplingParams(temperature=0.7, top_p=0.9)
    response = await llm.generate(message.content, sampling_params)
    await cl.Message(content=response).send()

启动应用:

chainlit run app.py -w

3.2 添加文档上传功能

现在,我们扩展应用以支持文档上传和RAG(检索增强生成)功能:

import os
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS

@cl.on_chat_start
async def start_chat():
    # 初始化模型
    llm = LLM(model="Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4", quantization="gptq")
    cl.user_session.set("llm", llm)
    
    # 初始化向量数据库
    embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
    cl.user_session.set("embeddings", embeddings)
    
    # 初始化知识库
    if not os.path.exists("vectorstore"):
        os.makedirs("vectorstore")
    vectorstore = FAISS.load_local("vectorstore", embeddings)
    cl.user_session.set("vectorstore", vectorstore)

@cl.on_message
async def main(message: cl.Message):
    llm = cl.user_session.get("llm")
    vectorstore = cl.user_session.get("vectorstore")
    
    # 检索相关知识
    docs = vectorstore.similarity_search(message.content, k=3)
    context = "\n\n".join([doc.page_content for doc in docs])
    
    # 构建提示词
    prompt = f"基于以下上下文回答问题:\n{context}\n\n问题: {message.content}\n回答:"
    
    # 生成回答
    sampling_params = SamplingParams(temperature=0.7, top_p=0.9)
    response = await llm.generate(prompt, sampling_params)
    await cl.Message(content=response).send()

@cl.on_file_upload(accept=["pdf"])
async def upload_file(files: List[cl.File]):
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
    embeddings = cl.user_session.get("embeddings")
    vectorstore = cl.user_session.get("vectorstore")
    
    for file in files:
        # 保存上传的文件
        file_path = f"uploads/{file.name}"
        with open(file_path, "wb") as f:
            f.write(file.content)
        
        # 加载并处理PDF
        loader = PyPDFLoader(file_path)
        pages = loader.load_and_split(text_splitter)
        
        # 添加到向量数据库
        vectorstore.add_documents(pages)
        vectorstore.save_local("vectorstore")
    
    await cl.Message(content=f"已成功上传并处理{len(files)}个文件").send()

4. 构建RAG知识库

4.1 文档处理流程

我们的RAG系统遵循以下流程:

  1. 用户上传PDF文档
  2. 系统将文档分割成小块
  3. 使用嵌入模型将文本转换为向量
  4. 将向量存储在FAISS向量数据库中
  5. 用户提问时,检索最相关的文档片段
  6. 将检索结果与问题一起发送给LLM生成回答

4.2 优化检索效果

为了提高检索质量,我们可以调整以下参数:

# 文本分割参数
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,  # 每个块的大小
    chunk_overlap=200,  # 块之间的重叠
    length_function=len,
    is_separator_regex=False,
)

# 检索参数
docs = vectorstore.similarity_search(
    query=message.content,
    k=3,  # 返回的文档数量
    filter=None  # 可选的过滤条件
)

5. 常见问题与解决方案

5.1 模型加载失败

如果模型加载失败,可以尝试:

  1. 检查CUDA和cuDNN版本是否兼容
  2. 确保有足够的GPU内存
  3. 尝试降低--gpu-memory-utilization参数值

5.2 文档处理速度慢

对于大型文档,处理可能需要较长时间。可以考虑:

  1. 增加chunk_size减少块数量
  2. 使用更高效的嵌入模型
  3. 在后台异步处理文档

5.3 回答质量不佳

如果回答质量不理想,可以尝试:

  1. 调整温度参数(temperature)控制创造性
  2. 增加检索的文档数量(k值)
  3. 优化提示词模板

6. 总结与下一步

通过本教程,我们完成了以下工作:

  1. 使用vLLM部署了Qwen1.5-1.8B-Chat-GPTQ-Int4模型
  2. 创建了基于Chainlit的交互式前端
  3. 实现了文档上传和处理功能
  4. 构建了RAG知识库系统

下一步可以考虑:

  • 支持更多文档格式(Word、Excel等)
  • 添加多轮对话历史
  • 实现用户认证和权限管理
  • 部署到生产环境

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐