确保你的环境中安装了以下工具和库:
Python:建议使用 Python 3.8 或更高版本。
PyTorch:用于运行深度学习模型。
Transformers:Hugging Face 提供的库,支持加载和运行预训练模型。
FAISS:用于向量检索的高效库。
GPTQ 支持库:如 auto-gptq 或 gptqmodel。
安装命令
运行以下命令安装所需的 Python 包:
pip install torch transformers accelerate faiss-cpu auto-gptq
确保你已经下载了 Qwen1.5-7B-Chat-GPTQ-Int4 模型,并保存在一个本地文件夹中(例如 ./qwen-model)。
ls ./qwen-model
你应该能看到类似以下的文件:
model-00001-of-00002.safetensors
model-00002-of-00002.safetensors
config.json
tokenizer_config.json
...
RAG 的核心是结合检索和生成。你需要一个知识库或文档集合作为检索来源。以下是常见的数据准备方法:
文本文件:将文档保存为 .txt 文件。
结构化数据:如 CSV、JSON 格式的数据集。
PDF 文档:使用工具(如 PyPDF2 或 pdfplumber)提取文本内容。
示例:假设你有一个包含多个文档的文件夹 ./data,每个文档是一个 .txt 文件。
RAG 的第一步是构建一个高效的检索系统,通常使用 FAISS 进行向量检索。
为了生成文档的向量表示,需要一个嵌入模型(Embedding Model)。你可以使用 Hugging Face 提供的预训练模型(如 sentence-transformers)。
安装 sentence-transformers
pip install sentence-transformers
加载嵌入模型
from sentence_transformers import SentenceTransformer
# 加载嵌入模型
embedding_model = SentenceTransformer('all-MiniLM-L6-v2')
将文档转换为向量并存储到 FAISS 索引中。
import os
import faiss
import numpy as np
# 加载文档
data_dir = "./data"
documents = []
for file_name in os.listdir(data_dir):
with open(os.path.join(data_dir, file_name), "r", encoding="utf-8") as f:
documents.append(f.read())
# 生成文档向量
doc_embeddings = embedding_model.encode(documents)
# 构建 FAISS 索引
dimension = doc_embeddings.shape[1]
index = faiss.IndexFlatL2(dimension) # 使用 L2 距离
index.add(np.array(doc_embeddings)) # 添加向量到索引
RAG 的第二步是使用 Qwen1.5-7B-Chat-GPTQ-Int4 模型生成回复。
from transformers import AutoModelForCausalLM, AutoTokenizer
# 模型路径
model_path = "./qwen-model"
# 加载分词器和模型
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(
model_path,
device_map="auto", # 自动分配设备(CPU 或 GPU)
torch_dtype="auto" # 自动选择数据类型(如 float16 或 int4)
)
将检索和生成结合起来,实现完整的 RAG 流程。
def rag_response(query, top_k=3, max_length=100):
"""
根据输入生成 RAG 回复。
:param query: 用户输入的文本
:param top_k: 检索的文档数量
:param max_length: 生成的最大长度
:return: 模型生成的回复
"""
# 1. 检索相关文档
query_embedding = embedding_model.encode([query])
distances, indices = index.search(np.array(query_embedding), top_k)
retrieved_docs = [documents[i] for i in indices[0]]
# 2. 构造上下文
context = "\n".join(retrieved_docs)
# 3. 生成回复
prompt = f"Context: {context}\nQuestion: {query}\nAnswer:"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(
inputs["input_ids"],
max_length=max_length,
num_return_sequences=1,
do_sample=True,
temperature=0.7,
top_p=0.9
)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
return response
运行以下代码测试 RAG 系统。
if __name__ == "__main__":
print("Welcome to Qwen RAG Chat!")
while True:
user_input = input("You: ")
if user_input.lower() in ["exit", "quit"]:
print("Exiting...")
break
response = rag_response(user_input)
print(f"Qwen: {response}")
. 示例交互
假设你的文档集合包含以下内容:
文档 1:介绍人工智能的基本概念。
文档 2:描述机器学习的工作原理。
文档 3:讨论深度学习的应用场景。
运行脚本后,你可以与系统进行交互:
Welcome to Qwen RAG Chat!
You: 什么是人工智能?
Qwen: 人工智能(AI)是指通过计算机模拟人类智能的技术,包括感知、推理、学习和决策等能力。
You: exit
Exiting...
原因:模型过大导致显存或内存溢出。
解决方法:
减少 max_length。
使用更小的模型(如 Qwen1.5-1B)。
启用混合精度(torch_dtype=torch.float16)。
原因:可能是 CUDA 或 cuDNN 安装不正确。
解决方法:
检查 nvidia-smi 是否正常工作。
确保安装了与 CUDA 版本匹配的 PyTorch。
原因:文档数量过多或向量维度较高。
解决方法:
使用 GPU 加速 FAISS(安装 faiss-gpu)。
对文档进行分块处理。
以下是完整流程: