【毕设】RAG项目初试
环境
python: 3.11.4
torch: 2.6.0+cu124
transformers: 4.57.3
langchain_community: 0.4.1
langchain_text_splitters: 1.0.0
langchain_chroma: 1.0.0
langchain_core: 1.1.0
langchain_huggingface: 1.1.0
历程
主要是踩坑记录
复现
环境
langchain 有些类位置在新版本中迁移了,注意就行
模型
文章里的源码,在分割文本创建索引向量数据库过程中,llm模型其实可以不用。而Embedding模型需要自行下载,而且需要看你的资料的语言选择合适的模型
向量数据库
源码中,采用了Qdrant,Windows系统中Docker配置麻烦,所以将向量数据库改为纯Python实现、无需额外服务的 Chroma
跑通
说明当前RAG框架可行,但能否基于大量FAQ、客服业务资料创建向量数据库有待下一步验证
实验
ImportError: cannot import name 'pipeline' from 'transformers'
卡了很久的问题,尝试改变 transformers 版本都无法解决,后来发现时 torchvision 与 torch 版本不兼容 导致 transformers.pipelines 在导入时失败
深层原因:当前安装的 torch==2.9.1 + torchvision==0.20.1+cu121 存在 ABI 或操作符注册不一致的问题。transformers 的 pipeline 功能依赖 torchvision(用于图像相关工具),即使你只做文本任务,也会触发该依赖链。
解决方式:
pip uninstall torch torchvision torchaudio -y
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
模型加载安全限制(CVE-2025-32434)
ValueError: Due to a serious vulnerability issue in `torch.load`...
...require users to upgrade torch to at least v2.6
原因:使用的 Embedding 模型是以 pytorch_model.bin 格式存储,transformers 库出于安全考虑,在检测到使用 torch.load 加载 .bin 文件时,强制要求 torch >= 2.6
解决方式:
pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 --index-url https://download.pytorch.org/whl/cu124
下一步计划
目前LLM在 RAG 加持下,更像一个能基于FAQ等客服资料生成准确回答的AI客服了,下一步是
代码
改写自文章
点击查看代码
# 1. 导入必要的库
# from langchain_community.chat_models import ChatTongyi
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_huggingface import HuggingFacePipeline
import bs4
import pprint
import torch
from transformers import (
AutoTokenizer,
AutoModelForCausalLM,
pipeline,
BitsAndBytesConfig
)
# 2. 配置 LLM 和 Embedding 模型
model_path = "E:\\models\\qwen\\Qwen3-4B-Instruct-2507"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_path,
device_map="auto", # 自动分配 GPU/CPU
torch_dtype=torch.bfloat16, # 或 torch.float16(根据显卡支持情况)
trust_remote_code=True,
# quantization_config=quantization_config # 如需 4-bit 量化,取消注释
)
# 创建文本生成 pipeline
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
max_new_tokens=512,
temperature=0.1,
top_p=0.95,
repetition_penalty=1.1,
do_sample=True,
eos_token_id=tokenizer.eos_token_id,
pad_token_id=tokenizer.pad_token_id if tokenizer.pad_token_id else tokenizer.eos_token_id,
)
# 包装为 LangChain LLM
llm = HuggingFacePipeline(pipeline=pipe)
# llm = ChatTongyi(model="qwen-max", temperature=0)
embedding_model = HuggingFaceBgeEmbeddings(
model_name="E:\\models\\BAAI\\bge-large-en-v1___5",
model_kwargs={"device": "cpu"},
encode_kwargs={"normalize_embeddings": True}
)
# 3. 加载外部文档
loader = WebBaseLoader(
web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
bs_kwargs=dict(
parse_only=bs4.SoupStrainer(
class_=("post-content", "post-title", "post-header")
)
)
)
blog_docs = loader.load()
# 4. 文本分割
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
chunk_size=300,
chunk_overlap=50
)
splits = text_splitter.split_documents(blog_docs)
# 5. 使用 Chroma 创建向量数据库并存储文档(自动嵌入)
vector_store = Chroma.from_documents(
documents=splits,
embedding=embedding_model,
persist_directory="./chroma_db" # 可选:持久化到本地目录
)
# 6. 创建检索器
retriever = vector_store.as_retriever(search_kwargs={"k": 1})
# 7. 创建 Prompt 模板
template = """Answer the question based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
# 8. 构建完整的 RAG 链
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
# 9. 使用 RAG 系统进行问答
result = rag_chain.invoke("What is Task Decomposition?")
pprint.pprint(result)
# 10. 单独检索示例(可选)
retrieved_docs = retriever.invoke("What is Task Decomposition?")
print(f"检索到的文档数量: {len(retrieved_docs)}")
pprint.pprint(retrieved_docs[0].page_content)

浙公网安备 33010602011771号