免费编程软件「python+pycharm」 链接:pan.quark.cn/s/48a86be2f…
一、为什么需要行业专属知识库?
通用版ChatGPT就像刚毕业的大学生,虽然基础扎实但缺乏行业经验。当用户问"半导体设备中的光刻机精度如何影响芯片良率"时,通用模型可能给出泛泛而谈的回答,而行业知识库训练后的模型能结合具体工艺参数给出专业分析。
行业知识库的核心价值在于:
- 解决专业术语理解偏差
- 提供实时行业数据支持
- 适配特定业务场景需求
- 降低模型幻觉(Hallucination)
二、数据采集:爬虫实战技巧
1. 目标网站选择策略
以半导体行业为例,优先选择:
-
权威数据源:SEMI官网、IC Insights报告
-
垂直论坛:EETOP、半导体行业观察
-
企业官网:ASML、TSMC技术白皮书
-
专利数据库:WIPO、国家知识产权局
# 示例:使用requests获取网页内容 import requests from bs4 import BeautifulSoup headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } url = 'https://www.***.org/en/market-data' response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 提取特定数据块(示例) data_blocks = soup.find_all('div', class_='data-block') for block in data_blocks: print(block.get_text().strip())
2. 动态内容处理方案
对于SPA(单页应用)网站,推荐使用Selenium或Playwright:
# 示例:使用Playwright处理动态加载
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto('https://www.***.com/reports/')
# 等待特定元素加载
page.wait_for_selector('.report-item')
reports = page.query_selector_all('.report-item')
for report in reports:
title = report.query_selector('.title').inner_text()
print(title)
browser.close()
3. PDF文档处理技巧
行业报告常以PDF形式存在,推荐组合使用PyPDF2和pdfplumber:
# 示例:提取PDF中的表格数据
import pdfplumber
def extract_tables_from_pdf(pdf_path):
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
tables = page.extract_tables()
for table in tables:
# 处理表格数据(示例:保存为CSV)
import csv
with open('output.csv', 'a', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerows(table)
extract_tables_from_pdf('semi_report_2023.pdf')
三、数据清洗与预处理
1. 结构化处理流程
典型清洗流程:
原始数据 → 去除HTML标签 → 标准化空格 → 纠正编码 → 去除停用词 → 实体识别 → 分块存储
# 示例:数据清洗管道
import re
from langdetect import detect
import jieba # 中文分词
def clean_text(text):
# 去除HTML标签
text = re.sub(r'<[^>]+>', '', text)
# 标准化空格
text = ' '.join(text.split())
# 中文处理示例
if detect(text[:50]) == 'zh-cn':
text = ' '.join(jieba.cut(text))
return text.strip()
# 示例使用
dirty_text = "<p>半导体设备 市场\n\t规模...</p>"
clean_text = clean_text(dirty_text)
print(clean_text) # 输出: 半导体设备 市场 规模...
2. 行业术语标准化
建立术语映射表(示例片段):
{
"光刻机": ["lithography machine", "stepper", "scanner"],
"晶圆": ["wafer", "silicon wafer"],
"良率": ["yield rate", "production yield"]
}
# 术语替换函数
term_map = {
"光刻机": "lithography machine",
# 其他术语...
}
def replace_terms(text):
for chinese, english in term_map.items():
text = text.replace(chinese, english)
return text
四、知识库构建方法
1. 向量数据库选择
主流方案对比:
| 方案 | 优势 | 适用场景 |
|---|---|---|
| Chroma | 纯Python实现 | 快速原型开发 |
| FAISS | Facebook开源,高性能 | 亿级向量检索 |
| Pinecone | 全托管服务 | 无需运维的云环境 |
| Milvus | 分布式架构 | 大规模生产环境 |
# 示例:使用Chroma构建知识库
from chromadb.config import Settings
from chromadb import Client
chroma_client = Client(Settings(
anon_client_id="my_app",
chroma_api_impl="rest"
))
collection = chroma_client.create_collection("semiconductor_knowledge")
# 添加文档
docs = [
"The latest EUV lithography machine has 13.5nm resolution",
"Wafer yield rate directly affects production cost"
]
collection.add(
documents=docs,
metadatas=[{"source": "tech_report"}, {"source": "white_paper"}]
)
2. 混合检索策略
结合关键词检索和语义检索:
def hybrid_search(query, collection, k=3):
# 关键词检索(示例)
keyword_results = [] # 实际应接入Elasticsearch等
# 语义检索
semantic_results = collection.query(
query_texts=[query],
n_results=k
)
# 合并结果(简单加权示例)
combined = []
for i in range(k):
score = 0.4 * (1 - i/k) + 0.6 * semantic_results['distances'][0][i]
combined.append({
'text': semantic_results['documents'][0][i],
'score': score
})
return sorted(combined, key=lambda x: x['score'], reverse=True)
五、模型微调实战
1. 微调方案选择
| 方案 | 训练数据量 | 硬件要求 | 训练时间 | 适用场景 |
|---|---|---|---|---|
| Full Fine-tuning | 全部参数 | 高配GPU | 长 | 彻底定制模型 |
| LoRA | 少量参数 | 中等GPU | 短 | 快速适配新领域 |
| Prefix-tuning | 极少量参数 | CPU | 最短 | 轻量级适配 |
2. LoRA微调示例
# 使用PEFT库实现LoRA微调
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model
model_name = "gpt2" # 或其他基础模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 配置LoRA参数
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters() # 应显示少量可训练参数
# 准备训练数据(示例)
train_texts = [
"半导体制造中光刻机的分辨率是",
"晶圆良率受哪些因素影响"
]
# 实际训练需要接入训练循环和评估逻辑
3. 提示工程优化
行业模型需要精心设计的提示模板:
def generate_prompt(query, context):
template = """
以下是与半导体制造相关的专业资料:
{context}
基于上述信息,请回答以下问题:
{query}
回答要求:
1. 使用专业术语
2. 提供数据支持
3. 控制在100字以内
"""
return template.format(context=context, query=query)
# 示例使用
context = "最新EUV光刻机分辨率达13.5nm,晶圆良率每提升1%可降低7%成本"
query = "分辨率提升对成本有何影响?"
prompt = generate_prompt(query, context)
print(prompt)
六、部署与监控方案
1. 轻量级部署方案
# 使用FastAPI快速部署
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import pipeline
app = FastAPI()
# 加载模型(实际应使用微调后的模型)
classifier = pipeline("text-generation", model="gpt2")
class Query(BaseModel):
question: str
context: str = None
@app.post("/answer")
async def get_answer(query: Query):
prompt = generate_prompt(query.question, query.context or "")
response = classifier(prompt, max_length=100)
return {"answer": response[0]['generated_text']}
# 启动命令:uvicorn main:app --reload
2. 监控指标体系
关键监控指标:
-
响应延迟(P99 < 2s)
-
回答准确率(通过人工抽检)
-
术语使用正确率
-
幻觉发生率
# 简单监控示例 import time from collections import defaultdict metrics = defaultdict(list) def log_metrics(response_time, is_accurate): metrics['response_time'].append(response_time) metrics['accuracy'].append(1 if is_accurate else 0) def calculate_metrics(): if metrics['response_time']: avg_time = sum(metrics['response_time'])/len(metrics['response_time']) accuracy = sum(metrics['accuracy'])/len(metrics['accuracy']) print(f"Avg RT: {avg_time:.2f}s | Accuracy: {accuracy*100:.1f}%")
常见问题Q&A
Q1:被网站封IP怎么办?
A:立即启用备用代理池,建议使用隧道代理(如站大爷IP代理),配合每请求更换IP策略。代码示例:
import requests
from random import choice
proxies = [
{'http': 'http://123.123.123.123:8080'},
# 更多代理...
]
def get_with_proxy(url):
proxy = choice(proxies)
try:
return requests.get(url, proxies=proxy, timeout=5)
except:
return get_with_proxy(url) # 递归重试
Q2:如何处理反爬机制?
A:组合使用以下策略:
- 设置合理的请求间隔(推荐3-10秒)
- 随机化User-Agent
- 使用Session对象保持会话
- 对JavaScript渲染的网站使用无头浏览器
Q3:微调数据量需要多少?
A:行业实践表明:
- LoRA微调:500-2000条高质量问答对即可见效
- 全量微调:建议至少10万条结构化数据
- 关键是要覆盖主要业务场景和术语
Q4:如何评估模型效果?
A:采用三维度评估:
- 自动指标:BLEU、ROUGE(需人工标注参考答案)
- 人工评估:抽样检查专业性和准确性
- 业务指标:用户满意度、任务完成率
Q5:如何保持知识库更新?
A:建立持续更新流程:
- 每周爬取最新行业报告
- 每月重新训练向量索引
- 每季度进行模型微调更新
- 设置异常值检测机制(如突然出现的大量新术语)