Qwen1.5-1.8B-GPTQ-Int4入门指南:Chainlit与LangChain集成实现RAG检索增强
1. 快速了解Qwen1.5-1.8B模型
Qwen1.5-1.8B-Chat-GPTQ-Int4是一个经过量化的轻量级语言模型,专门为资源受限的环境设计。这个模型基于通义千问1.5系列,采用了GPTQ量化技术将模型压缩到4位精度,大大减少了内存占用和计算需求。
这个模型特别适合在个人电脑或小型服务器上运行,即使没有高端GPU也能获得不错的文本生成效果。它支持中英文对话,能够理解上下文,生成连贯的回复,是入门级AI应用的理想选择。
模型的核心特点包括:支持长文本处理、具备多轮对话能力、响应速度快、资源消耗低。对于想要体验大模型能力但又不想投入太多硬件资源的开发者来说,这是一个很好的起点。
2. 环境准备与模型部署
2.1 系统要求
在开始之前,确保你的系统满足以下基本要求:
- 操作系统:Linux(推荐Ubuntu 18.04+)或Windows WSL2
- 内存:至少8GB RAM(推荐16GB)
- 存储空间:10GB可用空间
- Python版本:3.8或更高版本
- GPU:可选,但如果有NVIDIA GPU会获得更好的性能
2.2 安装必要的依赖包
首先创建并激活一个Python虚拟环境:
python -m venv qwen_env source qwen_env/bin/activate # Linux/Mac # 或者 qwen_env\Scripts\activate # Windows然后安装核心依赖包:
pip install torch torchvision torchaudio pip install transformers>=4.35.0 pip install vllm>=0.2.0 pip install chainlit>=1.0.0 pip install langchain>=0.0.300 pip install sentence-transformers faiss-cpu2.3 部署模型服务
使用vLLM来部署模型服务,这是一个高性能的推理引擎:
python -m vllm.entrypoints.api_server \ --model Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4 \ --trust-remote-code \ --served-model-name qwen-1.8b \ --host 0.0.0.0 \ --port 8000这个命令会启动一个本地API服务,监听8000端口。模型加载可能需要几分钟时间,取决于你的网络速度和硬件性能。
2.4 验证部署是否成功
使用webshell检查模型服务状态:
# 查看服务日志 cat /root/workspace/llm.log如果看到类似"Uvicorn running on http://0.0.0.0:8000"的信息,说明服务已经成功启动。
你也可以用curl测试API是否正常工作:
curl http://localhost:8000/v1/models应该会返回模型信息的JSON响应。
3. Chainlit前端集成
3.1 创建Chainlit应用
Chainlit是一个专门为AI应用设计的聊天界面框架,让我们创建一个简单的应用来调用模型。
首先创建app.py文件:
import chainlit as cl import requests import json # 配置模型API地址 MODEL_API_URL = "http://localhost:8000/v1/chat/completions" @cl.on_chat_start async def start_chat(): # 发送欢迎消息 welcome_msg = "你好!我是基于Qwen1.5-1.8B模型的AI助手,有什么可以帮你的吗?" await cl.Message(content=welcome_msg).send() @cl.on_message async def main(message: cl.Message): # 准备请求数据 payload = { "model": "qwen-1.8b", "messages": [ {"role": "system", "content": "你是一个有帮助的AI助手。"}, {"role": "user", "content": message.content} ], "temperature": 0.7, "max_tokens": 1024 } # 显示加载指示器 msg = cl.Message(content="") await msg.send() try: # 调用模型API response = requests.post( MODEL_API_URL, json=payload, headers={"Content-Type": "application/json"} ) if response.status_code == 200: result = response.json() ai_response = result['choices'][0]['message']['content'] await cl.Message(content=ai_response).send() else: error_msg = f"请求失败,状态码:{response.status_code}" await cl.Message(content=error_msg).send() except Exception as e: error_msg = f"发生错误:{str(e)}" await cl.Message(content=error_msg).send() if __name__ == "__main__": cl.run()3.2 启动Chainlit界面
运行以下命令启动前端界面:
chainlit run app.py -w打开浏览器访问显示的地址(通常是http://localhost:8000),你应该能看到一个聊天界面。在输入框中提问,模型会生成回复。
界面分为三个主要区域:左侧是聊天历史,中间是对话内容,右侧可以查看详细的运行信息。你可以尝试问一些简单问题,比如"介绍一下你自己"或者"写一首关于春天的诗"来测试模型效果。
4. LangChain集成与RAG实现
4.1 设置LangChain环境
LangChain是一个强大的框架,可以帮助我们构建更复杂的AI应用。首先让我们设置基本的LangChain环境:
from langchain.llms import VLLM from langchain.chains import RetrievalQA from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 初始化vLLM语言模型 llm = VLLM( model="Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4", trust_remote_code=True, max_new_tokens=512, temperature=0.7, top_p=0.9 )4.2 创建知识库文档
RAG(检索增强生成)的核心是有一个知识库。让我们创建一个简单的知识库:
# 创建示例文档 sample_docs = """ 通义千问1.5系列是阿里巴巴推出的语言模型系列,包含多种规模的模型。 Qwen1.5-1.8B是其中的轻量级版本,参数量为18亿。 该模型支持中英文双语,在代码生成、文本创作、对话交互等方面表现良好。 GPTQ-Int4量化技术将模型压缩到4位精度,大幅减少内存占用。 模型使用Transformer架构,具有SwiGLU激活函数和分组查询注意力机制。 """ # 保存文档到文件 with open("knowledge_base.txt", "w", encoding="utf-8") as f: f.write(sample_docs) # 加载和分割文档 loader = TextLoader("knowledge_base.txt") documents = loader.load() text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50 ) texts = text_splitter.split_documents(documents)4.3 构建向量数据库
使用FAISS来创建高效的向量检索系统:
# 初始化嵌入模型 embeddings = HuggingFaceEmbeddings( model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" ) # 创建向量数据库 vectorstore = FAISS.from_documents(texts, embeddings) vectorstore.save_local("faiss_index") # 创建检索器 retriever = vectorstore.as_retriever(search_kwargs={"k": 3})4.4 实现RAG问答系统
现在让我们把所有的组件组合起来,创建一个完整的RAG系统:
# 创建RAG链 qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, return_source_documents=True ) # 测试RAG系统 def ask_question(question): result = qa_chain({"query": question}) answer = result["result"] sources = result["source_documents"] print(f"问题: {question}") print(f"回答: {answer}") print("参考来源:") for i, doc in enumerate(sources): print(f"{i+1}. {doc.page_content[:100]}...") return answer # 示例问题 ask_question("Qwen1.5-1.8B是什么规模的模型?") ask_question("这个模型使用了什么量化技术?")5. 完整应用集成
5.1 增强的Chainlit应用
现在让我们把LangChain RAG系统集成到Chainlit应用中:
import chainlit as cl from langchain.llms import VLLM from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from langchain.chains import RetrievalQA # 初始化组件 @cl.cache def load_components(): llm = VLLM( model="Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4", trust_remote_code=True, max_new_tokens=512, temperature=0.7 ) embeddings = HuggingFaceEmbeddings( model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" ) vectorstore = FAISS.load_local("faiss_index", embeddings) retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, return_source_documents=True ) return qa_chain @cl.on_chat_start async def start_chat(): # 加载组件 qa_chain = load_components() cl.user_session.set("qa_chain", qa_chain) welcome_msg = """你好!我是基于Qwen1.5-1.8B模型的AI助手,具备RAG检索增强功能。 我可以根据知识库内容回答你的问题。有什么可以帮你的吗?""" await cl.Message(content=welcome_msg).send() @cl.on_message async def main(message: cl.Message): qa_chain = cl.user_session.get("qa_chain") # 显示加载状态 msg = cl.Message(content="") await msg.send() try: # 使用RAG系统回答问题 result = qa_chain({"query": message.content}) answer = result["result"] # 格式化回复,包含参考来源 response = f"{answer}\n\n**参考知识库内容生成**" await cl.Message(content=response).send() except Exception as e: error_msg = f"抱歉,处理问题时出现错误:{str(e)}" await cl.Message(content=error_msg).send() if __name__ == "__main__": cl.run()5.2 扩展知识库
你可以轻松扩展知识库来支持更多领域的问题。只需要创建更多的文本文件:
# 添加更多文档到知识库 additional_docs = [ "模型应用场景.txt", "技术细节说明.txt", "使用案例记录.txt" ] for doc_file in additional_docs: try: loader = TextLoader(doc_file) new_docs = loader.load() new_texts = text_splitter.split_documents(new_docs) # 添加到现有向量数据库 vectorstore.add_documents(new_texts) except FileNotFoundError: print(f"文件 {doc_file} 不存在,跳过") # 保存更新后的向量数据库 vectorstore.save_local("faiss_index")6. 实用技巧与优化建议
6.1 性能优化技巧
为了让应用运行更流畅,可以考虑以下优化措施:
内存优化:
# 调整vLLM参数减少内存使用 llm = VLLM( model="Qwen/Qwen1.5-1.8B-Chat-GPTQ-Int4", trust_remote_code=True, max_new_tokens=256, # 减少生成长度 temperature=0.7, gpu_memory_utilization=0.8 # 控制GPU内存使用 )响应速度优化:
# 使用异步处理提高响应速度 import asyncio from langchain.chains import RetrievalQA async def async_qa_query(question, qa_chain): loop = asyncio.get_event_loop() result = await loop.run_in_executor( None, lambda: qa_chain({"query": question}) ) return result6.2 效果提升建议
改进检索质量:
# 使用更好的嵌入模型 embeddings = HuggingFaceEmbeddings( model_name="sentence-transformers/paraphrase-multilingual-mpnet-base-v2" ) # 调整检索参数 retriever = vectorstore.as_retriever( search_type="mmr", # 使用最大边际相关度搜索 search_kwargs={"k": 5, "fetch_k": 10} )优化提示工程:
# 自定义提示模板 from langchain.prompts import PromptTemplate custom_prompt = PromptTemplate( template="""基于以下上下文信息回答问题。如果不知道答案,就说不知道。 上下文:{context} 问题:{question} 回答:""", input_variables=["context", "question"] ) qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=retriever, chain_type_kwargs={"prompt": custom_prompt} )7. 总结
通过本指南,你已经学会了如何部署Qwen1.5-1.8B-GPTQ-Int4模型,并使用Chainlit和LangChain构建一个完整的RAG检索增强应用。这个方案有以下几个突出优点:
轻量高效:4位量化模型大幅降低资源需求,适合个人开发者和小型项目易于使用:Chainlit提供友好的聊天界面,LangChain简化了复杂AI应用的开发知识增强:RAG架构让模型能够基于特定知识库生成更准确的回答灵活可扩展:可以轻松添加更多文档和功能模块
在实际使用中,你可以根据具体需求调整知识库内容、优化检索策略、改进提示工程,从而获得更好的效果。这个基础框架也可以扩展到更多的应用场景,如智能客服、知识管理、学习助手等。
记住,AI应用开发是一个迭代的过程,多尝试不同的配置和方法,找到最适合你需求的方案。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。