人工智能之语言领域
第二十一章 综合实战项目
文章目录
- 人工智能之语言领域
- [前言 综合实战项目](#前言 综合实战项目)
- [21.1 项目一:智能客服问答系统](#21.1 项目一:智能客服问答系统)
- [21.1.1 需求分析与架构设计](#21.1.1 需求分析与架构设计)
- [21.1.2 核心模块](#21.1.2 核心模块)
- [21.1.3 模型选型与部署上线](#21.1.3 模型选型与部署上线)
- 模型对比
- [部署方案:FastAPI + Docker](#部署方案:FastAPI + Docker)
- [21.2 项目二:多模态图文内容生成系统](#21.2 项目二:多模态图文内容生成系统)
- [21.2.1 需求分析与技术选型](#21.2.1 需求分析与技术选型)
- [21.2.2 核心模块](#21.2.2 核心模块)
- [(1)图像理解:BLIP-2 提取视觉特征](#(1)图像理解:BLIP-2 提取视觉特征)
- (2)文本生成:连接大语言模型
- (3)质量评估:CLIPScore
- [21.2.3 端到端实现与优化](#21.2.3 端到端实现与优化)
- 项目监控与迭代
- 小结
- 资料
前言 综合实战项目
本章通过两个工业级 NLP 项目 ------智能客服问答系统 与多模态图文内容生成系统 ,整合全书所学知识:从需求分析、架构设计、模型选型,到工程实现与部署。我们将采用模块化设计 + 现代工具链(Hugging Face、PyTorch、FastAPI),确保项目可落地、可扩展。
21.1 项目一:智能客服问答系统
21.1.1 需求分析与架构设计
需求场景
- 用户在电商平台提问:"如何退货?"、"订单没收到怎么办?"
- 系统需秒级响应,返回准确、简洁的答案
- 支持高频问题自动回答,复杂问题转人工
系统目标
- 准确率 > 90%(Top-1)
- 响应时间 < 500ms
- 支持动态更新知识库
整体架构
是
否
用户问句
问句理解模块
是否命中FAQ?
答案检索模块
意图识别 + 槽位填充
返回标准答案
调用业务API/转人工
用户
✅ 技术选型原则:
- FAQ 场景 → 语义匹配(非关键词)
- 动态知识 → 向量数据库(支持增量更新)
21.1.2 核心模块
(1)知识库构建
- 来源:历史客服对话、产品文档、FAQ 页面
- 格式 :
{"question": "如何退货?", "answer": "请在订单页面点击..."} - 预处理 :
- 去重(相似问合并)
- 标准化("退换货" → "退货")
python
# 示例:构建知识库 CSV
import pandas as pd
faq_data = [
{"question": "怎么退货?", "answer": "进入订单页,点击'申请退货'"},
{"question": "退货流程是什么?", "answer": "进入订单页,点击'申请退货'"},
{"question": "物流多久到?", "answer": "一般3-5个工作日"}
]
df = pd.DataFrame(faq_data)
df.to_csv("knowledge_base.csv", index=False)
(2)问句匹配(语义检索)
使用 Sentence-BERT + 向量数据库 实现语义相似度计算。
步骤:
- 将知识库所有问句编码为向量
- 用户问句实时编码
- 计算余弦相似度,返回 Top-K 匹配
python
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
import pandas as pd
class FAQMatcher:
def __init__(self, model_name="shibing624/text2vec-base-chinese"):
self.model = SentenceTransformer(model_name)
self.df = pd.read_csv("knowledge_base.csv")
self.questions = self.df["question"].tolist()
# 构建 FAISS 索引
question_embeddings = self.model.encode(self.questions)
self.index = faiss.IndexFlatIP(768) # 内积(等价于余弦)
faiss.normalize_L2(question_embeddings) # 归一化
self.index.add(question_embeddings.astype('float32'))
def match(self, query, top_k=1, threshold=0.7):
query_vec = self.model.encode([query])
faiss.normalize_L2(query_vec)
scores, indices = self.index.search(query_vec.astype('float32'), top_k)
if scores[0][0] > threshold:
idx = indices[0][0]
return {
"answer": self.df.iloc[idx]["answer"],
"score": float(scores[0][0]),
"matched_question": self.questions[idx]
}
return None
🔍 为什么用 FAISS?
- Facebook 开源,专为大规模向量检索优化
- 支持 GPU 加速,100 万条数据检索 < 10ms
(3)答案生成(备用方案)
若未命中 FAQ,使用 生成式模型(如 ChatGLM)生成答案。
python
from transformers import AutoTokenizer, AutoModel
class GenerativeAnswerer:
def __init__(self):
self.tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True)
self.model = AutoModel.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True).half().cuda()
def generate(self, query):
response, _ = self.model.chat(self.tokenizer, query, history=[])
return response
21.1.3 模型选型与部署上线
模型对比
| 方案 | 准确率 | 响应时间 | 更新成本 |
|---|---|---|---|
| 关键词匹配 | 低 (~60%) | 极快 | 高(需维护词典) |
| BERT 分类 | 中 (~80%) | 快 | 中(需重新训练) |
| SBERT + FAISS | 高 (>90%) | 快 | 低(仅加新向量) |
✅ 最终选择:SBERT + FAISS(平衡效果与维护性)
部署方案:FastAPI + Docker
python
# app.py
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
matcher = FAQMatcher()
class QueryRequest(BaseModel):
text: str
@app.post("/faq")
def faq_search(req: QueryRequest):
result = matcher.match(req.text)
if result:
return {"type": "faq", "answer": result["answer"]}
else:
return {"type": "fallback", "message": "正在为您转接人工客服..."}
Dockerfile:
dockerfile
FROM python:3.9
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
启动服务:
bash
docker build -t faq-service .
docker run -p 8000:8000 faq-service
🌐 调用示例:
bashcurl -X POST http://localhost:8000/faq -H "Content-Type: application/json" -d '{"text": "怎么退货?"}'
21.2 项目二:多模态图文内容生成系统
21.2.1 需求分析与技术选型
需求场景
- 输入:一张商品图片(如连衣裙)
- 输出:吸引人的营销文案(如"优雅碎花连衣裙,夏日必备!")
- 应用:电商详情页、社交媒体广告
技术挑战
- 图像理解:识别主体、属性(颜色、风格)
- 文本生成:符合品牌调性、带情感色彩
- 质量可控:避免事实错误(如"冬季羽绒服"配短袖图)
技术选型
| 模块 | 方案 |
|---|---|
| 图像编码 | BLIP-2(冻结 ViT + 可训练 Q-Former) |
| 文本生成 | ChatGLM-6B(中文生成能力强) |
| 质量评估 | CLIPScore(图文一致性) |
✅ 为什么选 BLIP-2?
- 仅需微调 Q-Former(<1% 参数)
- 支持开放域描述生成
21.2.2 核心模块
(1)图像理解:BLIP-2 提取视觉特征
python
from lavis.models import load_model_and_preprocess
from PIL import Image
class ImageEncoder:
def __init__(self):
self.model, self.vis_processors, _ = load_model_and_preprocess(
name="blip2_opt",
model_type="pretrain_opt2.7b", # 可替换为中文 LLM
is_eval=True,
device="cuda"
)
def encode(self, image_path):
raw_image = Image.open(image_path).convert("RGB")
image = self.vis_processors["eval"](raw_image).unsqueeze(0).to("cuda")
# 获取 Q-Former 输出的视觉特征
image_embeds = self.model.ln_vision(self.model.visual_encoder(image))
image_atts = torch.ones(image_embeds.size()[:-1], dtype=torch.long).to("cuda")
query_tokens = self.model.query_tokens.expand(image_embeds.shape[0], -1, -1)
query_output = self.model.Qformer.bert(
query_embeds=query_tokens,
encoder_hidden_states=image_embeds,
encoder_attention_mask=image_atts,
return_dict=True,
)
return query_output.last_hidden_state # [1, 32, 768]
(2)文本生成:连接大语言模型
BLIP-2 默认使用 OPT,我们替换为 ChatGLM 以支持中文:
python
# 修改 BLIP-2 的语言模型部分(简化版)
from transformers import AutoTokenizer, AutoModel
class MultimodalGenerator:
def __init__(self):
# 加载 BLIP-2 视觉编码器(冻结)
self.image_encoder = ImageEncoder()
# 加载 ChatGLM(冻结)
self.llm_tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True)
self.llm = AutoModel.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True).half().cuda()
# 可训练投影层(视觉特征 → LLM 词嵌入空间)
self.proj = torch.nn.Linear(768, 4096).cuda() # BLIP 输出768 → ChatGLM 词嵌入4096
def generate(self, image_path, prompt="描述这张图片:"):
# 1. 编码图像
visual_features = self.image_encoder.encode(image_path) # [1, 32, 768]
projected_features = self.proj(visual_features) # [1, 32, 4096]
# 2. 编码文本提示
text_input = self.llm_tokenizer(prompt, return_tensors="pt").to("cuda")
input_embeds = self.llm.transformer.embedding.word_embeddings(text_input.input_ids)
# 3. 拼接视觉+文本嵌入
inputs_embeds = torch.cat([projected_features, input_embeds], dim=1)
# 4. 生成文本
outputs = self.llm.generate(
inputs_embeds=inputs_embeds,
max_new_tokens=50,
do_sample=True,
top_p=0.9,
temperature=0.7
)
return self.llm_tokenizer.decode(outputs[0], skip_special_tokens=True)
⚠️ 注意 :完整实现需修改 BLIP-2 源码以支持
inputs_embeds输入。实际项目中建议使用 LLaVA 或 MiniGPT-4 等开源 MLLM。
(3)质量评估:CLIPScore
衡量生成文本与图像的语义一致性。
python
from transformers import CLIPProcessor, CLIPModel
from PIL import Image
def clipscore(image_path, caption):
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
image = Image.open(image_path)
inputs = processor(text=[caption], images=image, return_tensors="pt", padding=True)
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image
return logits_per_image.item() # 分数越高越匹配
# 示例
score = clipscore("dress.jpg", "优雅碎花连衣裙")
print(f"CLIPScore: {score:.2f}") # >25 通常表示良好匹配
21.2.3 端到端实现与优化
完整流水线
分数低
分数高
输入图像
BLIP-2 视觉编码
投影到 LLM 嵌入空间
ChatGLM 生成文本
CLIPScore 评估
重生成/人工审核
输出营销文案
性能优化策略
| 问题 | 解决方案 |
|---|---|
| 生成速度慢 | 使用 vLLM 或 TensorRT-LLM 加速推理 |
| 显存不足 | 4-bit 量化(bitsandbytes) |
| 事实错误 | 检索增强生成(RAG):从商品库检索属性 |
RAG 增强示例
python
# 伪代码:结合商品数据库
def generate_with_rag(image_path, product_db):
# 1. 从图像识别主体(如"连衣裙")
category = blip2_classify(image_path)
# 2. 从数据库检索属性
attributes = product_db.query(category=category)
prompt = f"商品属性:{attributes}。请生成营销文案:"
# 3. 生成
return multimodal_generator.generate(image_path, prompt)
项目监控与迭代
- 日志记录:记录用户问句、匹配结果、生成文本
- A/B 测试:对比不同模型版本的点击率/转化率
- 反馈闭环:用户点击"答案有帮助吗?" → 更新知识库
小结
本章通过两大实战项目,展示了 NLP 技术的工程化落地路径:
-
智能客服系统:
- 以 SBERT + FAISS 实现高效语义检索
- 采用 FastAPI + Docker 快速部署
-
多模态图文生成:
- 基于 BLIP-2 + ChatGLM 构建中文 MLLM
- 用 CLIPScore 保障生成质量
资料
咚咚王
《Python 编程:从入门到实践》
《利用 Python 进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第 3 版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow 机器学习实战指南》
《Sklearn 与 TensorFlow 机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python 深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习 +(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第 2 版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨 +&+ 张孜铭
《AIGC 原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战 AI 大模型》
《AI 3.0》