Qwen3.5大模型入门:手把手教你构建多模态RAG智能问答系统(收藏版)
本文详细介绍了如何利用Qwen3.5大模型、ColQwen2和Milvus构建一个高效的多模态RAG系统实现对PDF文档的智能问答。文章首先阐述了多模态RAG的概念和优势接着概述了技术栈和架构设计最后通过分步骤实操指导读者完成环境准备、模型加载、数据库初始化、PDF转图片、编码写入、检索重排序以及多模态LLM生成回答等关键环节。该方案特别适用于企业知识库部署、论文检索等场景能够有效保留文档的视觉信息提升检索精准度和召回率。最近关于Qwen3.5还有其幕后团队市场上的讨论沸沸扬扬但今天我们不聊八卦主要讲讲干货。其实自从这款模型在年前发布之后我们就一直有在关注和测试客观来说这的确是全球开源多模态大模型的天花板产品。架构层面Qwen3.5的亮点主要在MoE和线性注意力。其中前者已经是近两年的大模型标准解法而后者线性注意力也已经被国内kimi、minimax上一代模型采用线性注意力最新一代模型又换回了传统注意力在内一众领先模型玩家所接受。也是借助以上架构突破作为最新一代旗舰模型Qwen3.5的参数只有397B激活参数只有17B。是的相比相比上一代Qwen3-Max的万亿参数尺寸变小了但性能基本持平甚至超越。性价比拉满。这也是为什么在我们看来Qwen3.5是当下多模态RAG在模型侧的最优解之一。接下来本文将带你借助ColQwen2MilvusQwen3.5-397B-A17B从零构建一个多模态 RAG检索增强生成系统实现对 PDF 文档的智能问答。1、什么是多模态 RAG传统 RAG 的流程是提取文本 → 文本向量化 → 检索文本 → LLM 读文本回答。多模态 RAG的不同之处在于这样做的好处是表格、图表、排版、手写批注等视觉信息全部保留不会在 OCR 过程中丢失。2、架构概览3 、技术栈4 、实操环境准备安装 Python 依赖pip install colpali-engine pymilvus openai pdf2image torch pillow tqdm安装 popplerPDF 渲染引擎# macOS brew install poppler # Ubuntu/Debian sudo apt-get install poppler-utils # Windows: 从 https://github.com/oschwartz10612/poppler-windows 下载下载 Embedding 模型从 HuggingFace 下载 vidore/colqwen2-v1.0-merged 模型约 4.4GB放到本地目录mkdir -p ~/models/colqwen2-v1.0-merged # 下载所有模型文件到该目录获取 OpenRouter API Key前往 https://openrouter.ai/settings/keys 注册并获取 API Key。分步实现Step 1: 导入依赖和配置import os, io, base64 import torch import numpy as np from PIL import Image from tqdm import tqdm from pdf2image import convert_from_path from openai import OpenAI from pymilvus import MilvusClient, DataType from colpali_engine.models import ColQwen2, ColQwen2Processor# 配置参数 EMBED_MODEL os.path.expanduser(~/models/colqwen2-v1.0-merged) EMBED_DIM 128 # ColQwen2 输出向量维度 MILVUS_URI ./milvus_demo.db # Milvus Lite 本地文件 COLLECTION doc_patches TOP_K 3 # 检索返回的页数 CANDIDATE_PATCHES 300 # 每个 query token 的候选 patch 数 # OpenRouter LLM OPENROUTER_API_KEY os.environ.get( OPENROUTER_API_KEY, your-api-key-here, ) GENERATION_MODEL qwen/qwen3.5-397b-a17b # 设备选择 DEVICE cuda if torch.cuda.is_available() else cpu DTYPE torch.bfloat16 if DEVICE cuda else torch.float32 print(fDevice: {DEVICE})输出Device: cpuStep 2: 加载 Embedding 模型ColQwen2 是一个视觉语言模型能够将文档图片编码为ColBERT 式多向量表示。每页文档会产生数百个 128 维的 patch 向量。print(fLoading embedding model: {EMBED_MODEL}) emb_model ColQwen2.from_pretrained( EMBED_MODEL, torch_dtypeDTYPE, attn_implementationflash_attention_2 if DEVICE cuda else None, device_mapDEVICE, ).eval() emb_processor ColQwen2Processor.from_pretrained(EMBED_MODEL) print(fEmbedding model ready on {DEVICE})输出Step 3: 初始化 Milvus 向量数据库使用 Milvus Lite本地文件模式零配置无需启动服务。数据库结构说明-id: INT64自增主键-doc_idINT64文档页码第几页-patch_idxINT64该页内的第几个 patch-vectorFLOAT_VECTOR(128)patch 的 128 维向量milvus_client MilvusClient(uriMILVUS_URI) if milvus_client.has_collection(COLLECTION): milvus_client.drop_collection(COLLECTION) schema milvus_client.create_schema(auto_idTrue, enable_dynamic_fieldTrue) schema.add_field(id, DataType.INT64, is_primaryTrue) schema.add_field(doc_id, DataType.INT64) schema.add_field(patch_idx, DataType.INT64) schema.add_field(vector, DataType.FLOAT_VECTOR, dimEMBED_DIM) index milvus_client.prepare_index_params() index.add_index(field_namevector, index_typeFLAT, metric_typeIP) milvus_client.create_collection(COLLECTION, schemaschema, index_paramsindex) print(Milvus collection created.)输出Milvus collection created.Step 4: PDF 转图片将 PDF 每页渲染为 150 DPI 的图片。这一步不做任何文本提取——直接把文档当作图来处理。PDF_PATH Milvus vs Zilliz.pdf #替换成自己的PDF文档 images [p.convert(RGB) for p in convert_from_path(PDF_PATH, dpi150)] print(f{len(images)} pages loaded.) # 预览第一页 images[0].resize((400, int(400 * images[0].height / images[0].width)))输出Step 5: 编码图片并写入 Milvus用 ColQwen2 将每页图片编码为多向量 patch embeddings然后逐条插入 Milvus。# 编码所有页面 all_page_embs [] with torch.no_grad(): for i in tqdm(range(0, len(images), 2), descEncoding pages): batch images[i : i 2] inputs emb_processor.process_images(batch).to(emb_model.device) embs emb_model(**inputs) for e in embs: all_page_embs.append(e.cpu().float().numpy()) print(fEncoded {len(all_page_embs)} pages, ~{all_page_embs[0].shape[0]} patches per page, dim{all_page_embs[0].shape[1]})输出Encoded 17 pages, ~755 patches per page, dim128# 插入 Milvus for doc_id, patch_vecs in enumerate(all_page_embs): rows [ {doc_id: doc_id, patch_idx: j, vector: v.tolist()} for j, v in enumerate(patch_vecs) ] milvus_client.insert(COLLECTION, rows) total milvus_client.get_collection_stats(COLLECTION)[row_count] print(fIndexed {len(all_page_embs)} pages, {total} patches total.)输出Indexed 17 pages, 12835 patches total.也就是说上传的 17 页的 PDF 为例会产生 12,835 条 patch 向量记录每页约 755 个 patch。Step 6: 检索——查询编码 MaxSim 重排序这是整个系统的核心检索逻辑将用户问题编码为多个 token 向量每个 token 向量在 Milvus 中搜索最相似的 patch按文档页码聚合分数找到最相关的 TOP_K 页MaxSim 原理对于查询的每个 token 向量找到文档中最匹配的 patch最大内积然后将所有 token 的最大匹配分数求和作为该文档的总分。分数越高说明文档与查询的语义匹配度越高。question What is the difference between Milvus and Zilliz Cloud? # 1. 编码查询 with torch.no_grad(): query_inputs emb_processor.process_queries([question]).to(emb_model.device) query_vecs emb_model(**query_inputs)[0].cpu().float().numpy() print(fQuery encoded: {query_vecs.shape[0]} token vectors) # 2. 逐 token 搜索 Milvus doc_patch_scores {} for qv in query_vecs: hits milvus_client.search( COLLECTION, data[qv.tolist()], limitCANDIDATE_PATCHES, output_fields[doc_id, patch_idx], search_params{metric_type: IP}, )[0] for h in hits: did h[entity][doc_id] pid h[entity][patch_idx] score h[distance] doc_patch_scores.setdefault(did, {})[pid] max( doc_patch_scores.get(did, {}).get(pid, 0), score ) # 3. MaxSim 聚合每个文档的总分 所有匹配 patch 的分数之和 doc_scores {d: sum(ps.values()) for d, ps in doc_patch_scores.items()} ranked sorted(doc_scores.items(), keylambda x: x[1], reverseTrue)[:TOP_K] print(fTop-{TOP_K} retrieved pages: {[(d, round(s, 2)) for d, s in ranked]})输出Query encoded: 24 token vectorsTop-3 retrieved pages: [(16, 161.16), (12, 135.73), (7, 122.58)]#展示检索到的页面 context_images [images[d] for d, _ in ranked if d len(images)] for i, img in enumerate(context_images): print(f--- Retrieved page {ranked[i][0]} (score: {ranked[i][1]:.2f}) ---) display(img.resize((500, int(500 * img.height / img.width))))展示检索到的页面结果Step 7: 多模态 LLM 生成回答将检索到的页面原始图片不是文本连同用户问题一起发送给 Qwen3.5 多模态大模型。LLM 直接看图来回答问题。def image_to_uri(img): 将图片转为 base64 data URI用于发送给 LLM img img.copy() w, h img.size if max(w, h) 1600: r 1600 / max(w, h) img img.resize((int(w * r), int(h * r)), Image.LANCZOS) buf io.BytesIO() img.save(buf, formatPNG) return fdata:image/png;base64,{base64.b64encode(buf.getvalue()).decode()} # 构建多模态 prompt context_images [images[d] for d, _ in ranked if d len(images)] content [ {type: image_url, image_url: {url: image_to_uri(img)}} for img in context_images ] content.append({ type: text, text: ( fAbove are {len(context_images)} retrieved document pages.\n fRead them carefully and answer the following question:\n\n fQuestion: {question}\n\n fBe concise and accurate. If the documents dont contain frelevant information, say so. ), }) # 调用 LLM llm OpenAI(api_keyOPENROUTER_API_KEY, base_urlhttps://openrouter.ai/api/v1) response llm.chat.completions.create( modelGENERATION_MODEL, messages[{role: user, content: content}], max_tokens1024, temperature0.7, ) answer response.choices[0].message.content.strip() print(fQuestion: {question}\n) print(fAnswer: {answer})输出结果尾声以上教程仅为基础版本实践参考可以用于企业知识库部署、论文检索等对PDF有强需求的场景。它的优势在于少了传统传统 RAG 通过PyPDF2等工具或OCR完成PDF文本提取、对文本做分词处理、生成单向量Embedding这些繁琐的环节。而且面对扫描件PDF、图文混排文档、含公式与表格的专业资料或是加密PDF时都能完整保留所有视觉信息从根本上杜绝了文本提取带来的误差。此外ColBERT式多向量表示通过将每页图片拆分为约755个128维的patch向量可以让匹配粒度精细到视觉局部再搭配MaxSim重排序逻辑用查询的每个token向量匹配最相关的patch再聚合文档分数能精准锁定与问题最相关的页面大幅提升检索的精准度与召回率效果远胜传统单向量方案。这套架构唯一的小代价是ColQwen2约4.4GB的模型体积以及图片编码比文本编码稍高的推理耗时但对比它带来的检索精度与兼容性提升在绝大多数实际场景中都是完全可以接受的。最后2026年技术圈的分化愈发明显降薪裁员潮持续蔓延传统开发、测试等岗位大批缩水不少从业者陷入职业焦虑与之形成鲜明对比的是AI大模型相关岗位迎来疯狂扩招薪资逆势飙升150%大厂更是直接开出70-100W年薪疯抢具备实战能力的大模型人才甚至放宽年龄限制只求能快速落地技术、创造价值很多程序员、职场新人纷纷入局大模型领域绝非盲目跟风而是实实在在看到了不可替代的价值优势这也是2026年最值得抓住的职业风口1、窗口期红利入门门槛友好不同于成熟赛道的“内卷式招聘”2026年大模型人才缺口巨大简历只要达标掌握基础AI应用具备简单项目经验年龄、学历均非硬性要求小白可快速入门转行程序员也能无缝衔接2、技术可复用上手速度翻倍如果你有前后端开发、测试、数据分析等基础在大模型落地、系统部署、Prompt工程等环节会更具优势无需从零开始复用原有技术能力就能快速进阶3、懂业务更吃香竞争力翻倍单纯懂技术已不够2026年大厂更看重“技术业务”的复合型人才有垂直领域金融、医疗、工业等经验者能精准定位模型落地痛点薪资比纯技术岗高出30%以上更重要的是即便没有转型需求用AI大模型工具为工作赋能、提升效率也已经成为80%企业的硬性要求——不会用大模型提效未来很可能被行业淘汰那么2026年小白/程序员该如何高效学习大模型很多人想入门大模型却陷入两大困境要么到处搜集零散资料不成体系越学越懵要么被收费高昂的课程割韭菜花了钱却学不到实战技能白白浪费时间走弯路。今天就给大家精心整理了一份2026年最新、免费、系统化的AI大模型学习资源包覆盖从零基础入门到商业实战、从理论沉淀到面试通关的全流程所有资料均已整理归档无需拼凑直接领取就能上手学习小白可照做程序员可进阶扫码免费领取全部内容1、大模型系统化学习路线这份学习路线结合2026年行业趋势和新手学习规律由行业专家精心设计从零基础到精通每一步都有明确指引帮你节省80%的无效学习时间少走弯路、高效进阶避免踩坑。2、从0到进阶大模型学习视频教程从入门到进阶这里都有跟着老师学习事半功倍。3、大模型学习书籍电子文档涵盖2026年最新技术要点包括基础入门、Transformer核心原理、Prompt工程、RAG实战、模型微调与部署等内容4、AI大模型最新行业报告报告包含腾讯、阿里、甲子光年等权威机构发布的核心内容还有2026年中文大模型基准测评报告、AI Agent行业研究报告等帮你站在行业前沿把握技术风口。5、大模型项目实战配套源码项目包含Deepseek R1、GPT项目、MCP项目、RAG实战等热门方向还有视频配套代码手把手教你从0到1完成项目开发既能练手提升技术又能丰富简历为求职和职业发展加分。6、2026大模型大厂面试真题2026年大模型面试已全面升级不再单纯考察基础原理而是转向侧重技术落地和业务结合的综合考察很多程序员和新手因为缺乏针对性准备明明技术不错却在面试中失利。适用人群四阶段学习规划共90天可落地执行第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…扫码免费领取全部内容7、这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】