跳到主要内容基于 ChatGLM-6B 的智能写作助手开发实战 | 极客日志PythonAI算法
基于 ChatGLM-6B 的智能写作助手开发实战
基于 ChatGLM-6B 模型搭建智能写作助手,涵盖环境部署、核心功能开发及实际应用场景。通过 Streamlit 构建 Web 界面,实现多文体创作、语法检查、风格优化及批量处理工作流。结合提示词工程与量化技术,平衡性能与成本,适用于内容营销、办公文档及技术文档编写等场景,强调人机协作与伦理合规。
邪神洛基11 浏览 ChatGLM-6B 智能写作助手开发指南
引言
面对空白文档无从下笔、工作报告缺乏感染力、营销文案难以吸引眼球,是许多内容创作者和职场人的共同痛点。基于 ChatGLM-6B 构建一个智能写作助手,不仅能生成多文体内容,还能辅助检查语法、优化表达风格,甚至根据需求调整语气和长度。
本文分享从零搭建该助手的完整流程,涵盖环境部署、核心功能实现及实际应用场景。无论你是开发者希望集成写作能力,还是内容创作者寻求效率提升,都能从中获得参考。
ChatGLM-6B 模型简介
ChatGLM-6B 是由清华大学与智谱 AI 联合开发的开源对话语言模型,拥有 62 亿参数,针对中文场景进行了深度优化。
选择理由:
- 语言理解能力强:相比同规模模型,它在中文语境把握上更自然,能生成有温度的文字而非机械堆砌。
- 生成质量稳定:经过适当提示词引导后,内容逻辑清晰,无需大幅修改即可使用。
- 部署门槛低:量化后可在 6GB 显存环境下运行,甚至支持 CPU 推理,适合个人开发者本地部署。
- 场景覆盖广:在提纲写作、文案创作、邮件撰写等方面表现均衡,满足日常大部分需求。
当然,模型容量有限,处理极度专业或需深度推理的任务时可能不足,但作为辅助工具已足够胜任。
环境准备与快速部署
基础环境搭建
推荐使用 Python 3.8+ 版本。为避免污染系统环境,建议创建虚拟环境。
sudo apt-get update
sudo apt-get install python3.8 python3.8-venv python3.8-dev
python3.8 -m venv chatglm-env
source chatglm-env/bin/activate
pip install --upgrade pip
预置镜像快速部署
若不想配置环境,可使用云服务商提供的预置镜像(如阿里云、腾讯云)。以阿里云为例:
- 登录控制台,选择 GPU 实例规格(如
ecs.gn7i-c16g1.4xlarge)。
- 在镜像市场搜索'ChatGLM-6B'或'AI 推理'。
- 选择预装环境的镜像并完成实例创建。
启动服务通常只需一条命令:
cd /root/chatglm streamlit run web_demo2.py --server.port 50001
访问 http://你的公网 IP:50001 即可查看对话界面。此方式适合快速体验或对 Linux 不熟悉的用户。
手动部署(推荐用于开发)
手动部署能让你完全掌控每个环节。
第一步:下载模型和代码
git clone https://github.com/THUDM/ChatGLM-6B.git
cd ChatGLM-6B
git clone https://www.modelscope.cn/ZhipuAI/ChatGLM-6B.git
chatglm-6b && git checkout v1.0.16
cd
pip install torch transformers>=4.23.1
pip install streamlit gradio
pip install sentencepiece cpm_kernels accelerate
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
创建 test_model.py 验证加载是否正常:
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("./chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("./chatglm-6b", trust_remote_code=True).half().cuda()
model = model.eval()
response, history = model.chat(tokenizer, "你好,请介绍一下你自己", history=[])
print("模型回复:", response)
response, history = model.chat(tokenizer, "写一段关于春天的散文,100 字左右", history=history)
print("\n写作示例:", response)
编写一个简单的 Streamlit 应用 web_app.py:
import streamlit as st
from transformers import AutoTokenizer, AutoModel
import torch
@st.cache_resource
def load_model():
tokenizer = AutoTokenizer.from_pretrained("./chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("./chatglm-6b", trust_remote_code=True)
if torch.cuda.is_available():
model = model.half().cuda()
else:
model = model.float()
model = model.eval()
return tokenizer, model
def main():
st.title("ChatGLM-6B 智能写作助手")
st.markdown("---")
with st.sidebar:
st.header("写作设置")
writing_style = st.selectbox("选择写作风格", ["专业正式", "轻松活泼", "学术严谨", "创意文学", "简洁明了"])
text_length = st.slider("文章长度", 50, 1000, 300)
temperature = st.slider("创意度", 0.1, 1.0, 0.7)
col1, col2 = st.columns([3, 2])
with col1:
st.subheader("写作要求")
user_input = st.text_area("请描述你的写作需求:", height=150, placeholder="例如:写一篇关于人工智能未来发展的文章...")
if st.button("开始写作", type="primary"):
if user_input:
with st.spinner("正在生成内容..."):
tokenizer, model = load_model()
prompt = f"请以{writing_style}的风格,写一篇大约{text_length}字的文章。具体要求:{user_input}"
response, _ = model.chat(tokenizer, prompt, history=[], max_length=text_length + 100, temperature=temperature)
st.session_state.generated_text = response
with col2:
st.subheader("写作模板")
templates = {
"产品介绍": "请为 [产品名称] 写一份产品介绍,突出其核心功能和优势",
"工作报告": "请帮我撰写本周工作总结,重点说明完成事项和下周计划",
"营销文案": "为 [产品/服务] 创作吸引人的社交媒体推广文案",
"技术文档": "编写 [技术主题] 的使用说明文档,要求步骤清晰",
"邮件撰写": "写一封给客户的商务邮件,主题是 [邮件主题]"
}
selected_template = st.selectbox("快速选择模板", list(templates.keys()))
if st.button("应用模板"):
st.session_state.user_input = templates[selected_template]
st.rerun()
if "generated_text" in st.session_state:
st.markdown("---")
st.subheader("生成结果")
st.write(st.session_state.generated_text)
col1, col2, col3 = st.columns(3)
with col1:
if st.button("复制内容"):
st.write("内容已复制到剪贴板")
with col2:
if st.button("重新生成"):
del st.session_state.generated_text
st.rerun()
with col3:
if st.button("保存到文件"):
with open("generated_content.txt", "w", encoding="utf-8") as f:
f.write(st.session_state.generated_text)
st.success("已保存到 generated_content.txt")
if __name__ == "__main__":
main()
运行 streamlit run web_app.py,访问 http://localhost:8501 即可使用。
核心功能开发
基础部署完成后,我们需要扩展实用功能,如语法检查、风格优化和批量处理。
多种文体创作支持
class WritingAssistant:
def __init__(self, model, tokenizer):
self.model = model
self.tokenizer = tokenizer
self.templates = self._load_templates()
def _load_templates(self):
return {
"blog_post": {
"system": "你是一位经验丰富的博客作者,擅长用通俗易懂的语言讲解专业话题。",
"prompt": "请写一篇关于{ topic }的博客文章,要求标题吸引人、内容实用。文章长度约{ length }字,风格{ style }。"
},
"product_desc": {
"system": "你是一位专业的电商文案写手,擅长突出产品卖点。",
"prompt": "为产品'{ product }'撰写商品描述,重点突出核心功能、目标用户及使用场景。"
},
"tech_doc": {
"system": "你是一位严谨的技术文档工程师,注重准确性和可读性。",
"prompt": "编写{ topic }的技术文档,包含概述、安装部署、使用示例及常见问题。"
},
"email": {
"system": "你是一位专业的商务沟通专家。",
"prompt": "写一封{ type }邮件,收件人是{ recipient },主题是{ subject }。主要内容:{ content }。"
}
}
def generate_content(self, genre, **kwargs):
if genre not in self.templates:
return "不支持的文体类型"
template = self.templates[genre]
prompt = template["prompt"].format(**kwargs)
history = [{"role": "system", "content": template["system"]}]
response, _ = self.model.chat(self.tokenizer, prompt, history=history, max_length=kwargs.get("max_length", 500))
return response
assistant = WritingAssistant(model, tokenizer)
blog_content = assistant.generate_content(genre="blog_post", topic="人工智能", length=800)
语法检查与修正
class GrammarChecker:
def __init__(self, model, tokenizer):
self.model = model
self.tokenizer = tokenizer
self.common_errors = self._load_error_patterns()
def _load_error_patterns(self):
return {
"的得地": {"pattern": r"([^的地得]+)(的地得)([^的地得]+)", "description": "的、地、得使用错误"},
"标点错误": {"pattern": r"[,。;:!?]{2,}", "description": "重复标点符号"}
}
def check_grammar(self, text):
errors = []
for error_type, rule in self.common_errors.items():
import re
matches = re.finditer(rule["pattern"], text)
for match in matches:
errors.append({"type": error_type, "position": match.start(), "text": match.group()})
return errors
def auto_correct(self, text):
errors = self.check_grammar(text)
corrected_text = text
for error in sorted(errors, key=lambda x: x["position"], reverse=True):
start = error["position"]
end = start + len(error.get("original", ""))
corrected_text = corrected_text[:start] + "[修正]" + corrected_text[end:]
return corrected_text, errors
风格优化与调整
class StyleOptimizer:
def __init__(self, model, tokenizer):
self.model = model
self.tokenizer = tokenizer
self.style_profiles = {
"formal": {"description": "正式专业风格", "characteristics": ["使用完整句子", "避免口语化"]},
"casual": {"description": "轻松随意风格", "characteristics": ["使用短句", "加入个人感受"]}
}
def convert_style(self, text, target_style, intensity=0.7):
if target_style not in self.style_profiles:
return f"不支持的风格:{target_style}"
profile = self.style_profiles[target_style]
prompt = f"请将以下文本转换为{target_style}风格。特点:{', '.join(profile['characteristics'])}。原文本:{text}"
response, _ = self.model.chat(self.tokenizer, prompt, history=[], max_length=len(text) + 200, temperature=0.5 + intensity * 0.3)
return response
批量处理与工作流集成
class BatchProcessor:
def __init__(self, writer, checker, optimizer):
self.writer = writer
self.checker = checker
self.optimizer = optimizer
def process_pipeline(self, tasks, pipeline_steps=None):
if pipeline_steps is None:
pipeline_steps = ["generate", "check", "optimize"]
results = []
for task in tasks:
try:
current_content = task.get("initial_content", "")
step_log = []
if "generate" in pipeline_steps and not current_content:
current_content = self.writer.generate_content(**task)
step_log.append({"step": "generate", "result": "success"})
if "check" in pipeline_steps and current_content:
corrected, errors = self.checker.auto_correct(current_content)
if corrected != current_content:
current_content = corrected
step_log.append({"step": "check", "result": "corrected"})
results.append({"task_id": task.get("id"), "content": current_content, "status": "completed"})
except Exception as e:
results.append({"task_id": task.get("id"), "error": str(e), "status": "failed"})
return results
实际应用场景
内容创作与营销
- 社交媒体内容:根据产品特点生成微博、公众号等不同平台的文案。
- 产品描述优化:将枯燥参数转化为吸引人的卖点描述。
- 邮件营销:根据客户画像生成个性化邮件,提高打开率。
办公文档处理
- 智能会议纪要:整理录音转文字,提炼重点决策和待办事项。
- 工作报告生成:输入工作内容,自动生成格式规范的报告。
- 邮件自动回复:设置模板,快速生成常见咨询回复。
学习与教育辅助
- 论文写作辅助:整理文献笔记、生成大纲、检查语法。
- 教学材料生成:快速生成练习题、案例分析。
- 作文批改建议:指出基础问题,辅助教师教学。
技术文档编写
- API 文档生成:根据代码注释生成初稿。
- 使用教程编写:将复杂流程写成易懂教程。
- 代码注释优化:检查现有注释清晰度。
优化建议与注意事项
提示词优化技巧
- 具体明确:避免模糊指令,如'写一篇好文章',应指定字数、主题和风格。
- 提供示例:给出特定格式或风格的样例,效果更稳定。
- 分步骤引导:复杂任务拆分为列大纲、写内容、总结优化等步骤。
- 设置约束:明确长度限制、风格要求和禁忌内容。
质量控制方法
- 多轮生成对比:生成多个版本择优选取。
- 关键信息验证:人工核对数据、日期、名称等事实性内容。
- 敏感内容过滤:设置关键词过滤,避免生成不当内容。
性能优化建议
- 模型量化:使用 INT8 或 INT4 量化降低显存占用。
- 缓存机制:缓存常用提示词的输出,避免重复计算。
- 异步处理:耗时任务使用消息队列异步处理。
from transformers import AutoModel
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).quantize(8).half().cuda()
伦理与合规考虑
- 版权问题:确保生成内容不侵犯他人版权。
- 透明度:AI 生成内容应适当标注。
- 责任归属:使用者对最终内容负责。
- 数据隐私:处理敏感数据时需确保安全。
总结
搭建智能写作助手的过程并不复杂。ChatGLM-6B 作为开源中文模型,在写作辅助方面表现优异。通过合理的提示词工程和功能扩展,它能有效解决重复性写作任务,让人专注于创意和策略。
建议从基础功能入手,逐步添加高级特性。过程中遇到生成不理想或速度慢的问题,可通过优化提示词、调整参数或升级硬件解决。保持学习和尝试的心态,利用技术提升工作效率,才是 AI 工具的核心价值所在。
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online