AI之_3_大模型语言能力
前言
Github:https://github.com/HealerJean
一、我们学会和AI说话
提示就像给机器人下指令:“帮我写一封道歉信”、“总结这篇新闻”。
想象一下,你有一个超级聪明的朋友,读过全网所有书、看过所有电影、听懂了所有对话。你只需要说一句话,他就能回答你、帮你写文章、甚至编程。
这个朋友就是 大语言模型(LLM),比如 Qwen、ChatGPT、Llama 等。
你和它的交流方式叫 提示(Prompt),也就是你输入的一段文字。
1、OpenAI SDK
import os
from openai import OpenAI
client = OpenAI(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx"
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
completion = client.chat.completions.create(
# 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
model="qwen-plus",
messages=[
{"role": "system", "content": "你是一个专业的技术研究员"},
{"role": "user", "content": "我是HealerJean,帮我找下网上关于他的一些信息"},
]
)
print(completion.model_dump_json())
{
"usage": {
"total_tokens": 272,
"prompt_tokens_details": {
"cached_tokens": 0,
"audio_tokens": null
},
"prompt_tokens": 31,
"completion_tokens_details": null,
"completion_tokens": 241
},
"system_fingerprint": null,
"service_tier": null,
"object": "chat.completion",
"model": "qwen-plus",
"id": "chatcmpl-137e94be-3a4e-4fd4-adf5-3404e774bbcf",
"created": 1764310918,
"choices": [
{
"message": {
"tool_calls": null,
"role": "assistant",
"refusal": null,
"function_call": null,
"content": "目前互联网上没有公开的、被广泛记录的公众人物名为“HealerJean”具有明确的、可验证的身份信息。这个名字可能属于一位非公众领域的个人,或者是一位在特定领域(如技术、艺术、社交媒体等)使用该昵称的创作者,但尚未形成大规模公开资料。\n\n如果你指的是某个特定领域的人物(例如:GitHub 上的技术博主、CSDN 或博客园中的开发者、某位开源贡献者、或是社交媒体上的内容创作者),建议你提供更多背景信息,例如:\n\n- 他是否活跃在某个平台(如 GitHub、知乎、掘金、B站、微信公众号等)?\n- 是否与某个技术栈相关(如 Java、Spring Boot、前端开发等)?\n- 是否写过某些知名的技术文章或开源项目?\n\n例如,在中文技术社区中,有一些开发者使用类似“HealerJean”的名字发布内容,但需要结合具体上下文来确认身份。\n\n⚠️ 注意:如果这是你本人的名字或笔名,并希望了解网络上的个人信息暴露情况,我可以帮助你分析潜在的隐私风险并提供建议。\n\n请补充更多信息,以便我更准确地协助你。",
"audio": null,
"annotations": null
},
"logprobs": null,
"index": 0,
"finish_reason": "stop"
}
]
}
2、requests原生
import requests
import json
import os
# 从环境变量获取API密钥
API_KEY = os.environ.get("DASHSCOPE_API_KEY")
if not API_KEY:
print("请先设置环境变量: export DASHSCOPE_API_KEY='sk-你的密钥'")
exit(1)
# OpenAI兼容模式API端点
URL = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
"X-DashScope-SSE": "enable" # 必须的兼容模式头
}
# 简洁的请求结构
payload = {
"model": "qwen-plus",
"messages": [
{"role": "system", "content": "你是一个专业的技术研究员"},
{"role": "user", "content": "我是HealerJean,帮我找下网上关于他的一些信息"}
],
"temperature": 0.3, # 0.0-1.0,值越低回复越确定
"max_tokens": 2000 # 最大回复长度
}
try:
response = requests.post(URL, headers=headers, json=payload, timeout=30)
response.raise_for_status() # 检查HTTP错误
result = response.json()
print(result)
except Exception as e:
print(f"错误: {str(e)}")
if hasattr(e, 'response') and e.response is not None:
print(f"详细错误: {e.response.text}")
{
"usage": {
"total_tokens": 478,
"prompt_tokens_details": {
"cached_tokens": 0
},
"prompt_tokens": 31,
"completion_tokens": 447
},
"system_fingerprint": null,
"object": "chat.completion",
"model": "qwen-plus",
"id": "chatcmpl-9ad332fc-7986-450f-a326-ca60bb58f1e3",
"created": 1764311048,
"choices": [
{
"message": {
"role": "assistant",
"content": "您好,目前根据您提供的信息,“HealerJean”看起来像是一个网络昵称或笔名,但在公开的权威资料、学术数据库、主流社交媒体平台(如LinkedIn、GitHub、知乎、微博等)以及新闻报道中,并没有明确指向某位广为人知的公众人物使用这一名称。\n\n以下是一些可能的情况和建议:\n\n1. **可能是个人化昵称**:\n - “HealerJean” 可能是您或其他人在网络社区(如CSDN、掘金、博客园、V2EX、GitHub 等技术平台)使用的ID。这类昵称常见于程序员、开发者或内容创作者。\n - 建议您可以尝试在以下平台搜索该用户名:\n - GitHub(https://github.com/)\n - CSDN(https://www.csdn.net/)\n - 掘金(https://juejin.cn/)\n - 博客园(https://www.cnblogs.com/)\n - 知乎(https://www.zhihu.com/)\n\n2. **名字构成分析**:\n - “Healer” 意为“治愈者”,常用于表达关怀、心理疗愈、健康领域的内容;\n - “Jean” 是常见的英文名(也可能是中文名“Jean”音译,如“娟”、“建”等);\n - 组合起来可能是一位关注心理健康、灵性成长、编程疗愈(如用代码表达情感)、或者技术写作中带有温情风格的人。\n\n3. **隐私保护提醒**:\n - 如果这是您自己的网名,且不希望被广泛检索到,建议检查各平台的隐私设置。\n - 若涉及他人,请注意尊重他人隐私,避免过度挖掘个人信息。\n\n如果您能提供更多背景信息(例如:所在领域——是程序员?心理咨询师?博主?所在地区?曾发布的内容类型?),我可以帮助更精准地查找或分析。\n\n是否可以补充一些上下文?比如:\n- 这个名字出现在哪个平台?\n- 是否与某个技术文章、开源项目、视频或社交账号相关?\n\n我会尽力协助您进一步定位。"
},
"logprobs": null,
"index": 0,
"finish_reason": "stop"
}
]
}
3、字段解释
1) 核心回复内容(最常用)
| 字段 | 值示例 | 说明 |
|---|---|---|
choices[0].message.role |
"assistant" |
回复者角色(固定为 assistant) |
choices[0].message.content |
"目前互联网上没有公开的..." |
实际回复文本(您需要的核心内容) |
choices[0].finish_reason |
"stop" |
生成结束原因: • "stop":模型自然结束 • "length":达到 max_tokens 限制 • "tool_calls":需要调用函数 |
choices[0].finish_reason生成结束原因:"stop":模型自然结束"length":达到max_tokens限制"tool_calls":需要调用函数
2)Token 使用统计(计费/性能分析)
| 字段 | 值 | 说明 |
|---|---|---|
usage.prompt_tokens |
31 |
输入消耗的 token 数(您的问题 + system 提示) |
usage.completion_tokens |
241 |
输出消耗的 token 数(模型生成的回复) |
usage.total_tokens |
272 |
总消耗 = prompt + completion(用于计费) |
usage.prompt_tokens_details.cached_tokens |
0 |
缓存命中 token 数(DashScope 的缓存优化,当前未使用) |
3)请求元数据(调试/追踪用)
| 字段 | 值示例 | 说明 |
|---|---|---|
id |
"chatcmpl-137e94be-..." |
唯一请求ID(联系阿里云技术支持时提供) |
created |
1764310918 |
Unix 时间戳(对应 2025-11-28 14:21:58 UTC) |
model |
"qwen-plus" |
实际调用的模型名称 |
object |
"chat.completion" |
响应类型(固定值) |
system_fingerprint |
null |
模型部署标识(阿里云暂未启用) |
4)高级功能字段(当前未使用)
| 字段 | 值 | 说明 |
|---|---|---|
choices[0].message.tool_calls |
null |
函数调用结果(当使用 Function Calling 时返回) |
choices[0].message.function_call |
null |
旧版函数调用(已弃用) |
choices[0].message.refusal |
null |
拒绝回答的内容(如涉及敏感话题) |
service_tier |
null |
服务等级(阿里云未启用) |
audio / annotations |
null |
多模态扩展字段(纯文本模式无用) |
4、开发规范
1)请求结构
payload = {
"model": "qwen-plus",
"messages": [
{"role": "system", "content": "你是一个专业的技术研究员"},
{"role": "user", "content": "我是HealerJean,帮我找下网上关于他的一些信息"}
],
"temperature": 0.3,
"max_tokens": 2000
}
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
model |
str |
是 | — | 模型名称,如 "qwen-plus"、"qwen-max"、"qwen-turbo" |
messages |
List[Dict] |
是 | — | 对话消息列表,每个元素含 role 和 content • role: "system" / "user" / "assistant" • content: 字符串 |
temperature |
float |
否 | 0.7~0.8 |
控制输出随机性: 0.0:确定性强 1.0:创意性强 |
top_p |
float |
否 | 1.0 |
核采样阈值(累积概率),通常与 temperature 二选一 |
max_tokens |
int |
否 | 模型上限 | 模型最多生成的 ·token 数(不含输入) 超过则截断 |
stream |
bool |
否 | False |
是否启用流式响应(SSE) True 时返回 text/event-stream |
stop |
str 或 List[str] |
否 | None |
遇到指定字符串时停止生成 例:["\n\n", "用户:"] |
seed |
int |
否 | None |
随机种子,用于结果可复现(调试用) |
response_format |
Dict |
否 | None |
强制输出格式: {"type": "json_object"} ⚠️ 需在 system 中说明 JSON 结构 |
tools |
List[Dict] |
否 | None |
定义可调用的函数 |
tool_choice |
str 或 Dict |
否 | "auto" |
控制是否调用工具: • "auto":模型决定 • "none":不调用 • {"type": "function", "function": {"name": "xxx"}}:强制调用 |
user |
str |
否 | None |
用于标识终端用户(审计/限流) |
- 中文任务优先选
qwen-plus或qwen-max - 要
JSON输出? 必须同时:- 设置
"response_format": {"type": "json_object"} - 在
system消息中明确JSONschema
- 设置
-
流式输出? 设置
"stream": True并用SSE客户端解析 -
可控输出:加
max_tokens防止过长-
中文 1 字 ≈ 1~2 tokens(取决于分词)
-
英文 1 单词 ≈ 1.3 tokens
-
您的 31 tokens 输入 ≈ 20~25 个中文字
-
-
调试一致性:加
seed=42 - 避免幻觉:用低
temperature(0.1~0.3)
2)角色定义
| Role 值 | 说明 | 使用场景 |
|---|---|---|
"system" |
系统提示 | 定义 AI 的行为准则、身份、规则(如您代码中的客服设定) |
"user" |
用户输入 | 真实用户提出的问题或指令 |
"assistant" |
模型回复 | AI 生成的回答(也可以用于多轮对话的历史记录) |
2)finish_reason 必须检查
如果返回
"length",说明回复被截断,需增大max_tokens
if response["choices"][0]["finish_reason"] == "length":
print("警告:回复被截断!")
4、FQA
1)OpenAI SDK、和 requests 原生 使用哪种
| 特性 | 第一份代码 (OpenAI SDK) | 第二份代码 (requests原生) |
|---|---|---|
| 实现方式 | 高级SDK封装 | 底层HTTP请求 |
| 依赖包 | openai |
requests |
| URL配置 | base_url=".../compatible-mode/v1" |
完整URL ".../compatible-mode/v1/chat/completions" |
| 错误处理 | SDK内置处理 | 手动try-except |
| 输出内容 | 完整JSON响应 | 仅提取回复文本 |
| 代码复杂度 | 简洁(3行核心代码) | 较复杂(需手动处理细节) |
| 未来使用 | 推荐 | 不推荐 |
2)OpenAI SDK ≠ 只能调用 OpenAI 官方服务
只要
DashScope维持OpenAI兼容模式,就能用OpenAI SDK。
OpenAI SDK是一个 通用的 HTTP 客户端库,遵循OpenAI API规范- 阿里云 DashScope 主动兼容了
OpenAIAPI协议,所以任何支持 OpenAI 协议的客户端(包括官方 SDK)都能调用 - 这就像:Java 的 JDBC 接口 ≠ 只能连 MySQL,PostgreSQL、Oracle 也都实现了 JDBC
这行代码决定了你调谁,不是 SDK 决定的!
base_url="https://dashscope.aliyuncs.com/v1" # ← 关键在这里!
二、无需任何机器学习-大语言模型分析内容
| 技巧 | 效果 |
|---|---|
| 设定角色(system prompt) | 让 AI 表现更专业 |
| 多轮对话 | 模拟真实聊天 |
| 限制输出风格 | 避免啰嗦或跑题 |
1、直接提问法(最简单)
import os
from openai import OpenAI
client = OpenAI(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx"
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
prompt = """
请分析以下句子的情感倾向,并给出评分(-1 到 1):
- 很开心能参加这次会议。
- 这个产品太差了,根本不好用。
- 一般般吧,还可以接受。
格式如下:
句子:xxx
情感:积极 / 消极 / 中性
得分:xx
"""
response = client.chat.completions.create( # ← 关键:完整调用路径
model="qwen-plus",
messages=[{"role": "user", "content": prompt}],
temperature=0.3
)
print(response.choices[0].message.content)
└─[$] python3 qwen_first.py [14:58:55]
句子:很开心能参加这次会议。
情感:积极
得分:0.9
句子:这个产品太差了,根本不好用。
情感:消极
得分:-0.9
句子:一般般吧,还可以接受。
情感:中性
得分:0.1
2、结构化输出(JSON 模式)
import os
from openai import OpenAI
client = OpenAI(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx"
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
prompt = """
请分析以下文本的情感,并返回 JSON 格式结果:
{
"text": "原文",
"sentiment": "positive/negative/neutral",
"confidence": 0.0 ~ 1.0,
"summary": "一句话总结"
}
文本:这部电影真的太棒了,演员演技炸裂,剧情紧凑,强烈推荐!
"""
response = client.chat.completions.create( # ← 关键:完整调用路径
model="qwen-plus",
messages=[{"role": "user", "content": prompt}],
temperature=0.3
)
print(response.choices[0].message.content)
└─[$] python3 qwen_first.py [15:02:44]
{
"text": "这部电影真的太棒了,演员演技炸裂,剧情紧凑,强烈推荐!",
"sentiment": "positive",
"confidence": 0.99,
"summary": "对电影给予高度评价,表达强烈的喜爱和推荐。"
}
3、批量分析用户评论
假设你有一个电商网站,收到 10 条用户评论,你想自动分类情感。
import os
from openai import OpenAI
import json
client = OpenAI(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx"
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
comments = [
"物流很快,商品质量很好,满意!",
"客服态度差,退换货麻烦,不推荐。",
"一般吧,没什么特别的。",
"性价比超高,下次还买!"
]
for comment in comments:
prompt = f"""
请严格按以下 JSON 格式分析情感,不要输出任何其他内容:
{
"text": "{comment}",
"sentiment": "positive/negative/neutral",
"confidence": 0.0~1.0,
"summary": "一句话总结"
}
"""
response = client.chat.completions.create( # 缩进到循环内
model="qwen-plus",
messages=[{"role": "user", "content": prompt}],
temperature=0.3
)
print(response.choices[0].message.content)
└─[$] python3 qwen_first.py [15:09:47]
{
"text": "物流很快,商品质量很好,满意!",
"sentiment": "positive",
"confidence": 0.99,
"summary": "用户对物流速度和商品质量表示满意,整体体验良好。"
}
{
"text": "客服态度差,退换货麻烦,不推荐。",
"sentiment": "negative",
"confidence": 0.98,
"summary": "用户对客服态度和退换货流程表示不满,整体评价负面。"
}
{
"text": "一般吧,没什么特别的。",
"sentiment": "neutral",
"confidence": 0.95,
"summary": "表达对事物平淡无奇的看法,情感倾向中性。"
}
{
"text": "性价比超高,下次还买!",
"sentiment": "positive",
"confidence": 0.99,
"summary": "用户对产品性价比非常满意,表达强烈购买意愿。"
}
4、多轮对话
import os
from openai import OpenAI
import json
client = OpenAI(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx"
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
system_prompt = """
你是一个专业的客服助手,负责回答用户的咨询问题。
请保持礼貌、专业、简洁。
如果不知道答案,请说:“这个问题我暂时无法回答,请联系人工客服。”
"""
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": "你们几点上班?"},
{"role": "assistant", "content": "我们工作时间为每天 9:00 - 18:00。"},
{"role": "user", "content": "怎么退款?"}
]
response = client.chat.completions.create( # 缩进到循环内
model="qwen-plus",
messages=messages,
temperature=0.3
)
print(response.choices[0].message.content)
您好,关于退款流程,通常需要您提供订单号和相关信息,我们会为您提交申请。请您在订单页面点击“申请退款”,按照提示操作即可。如有问题,也可联系人工客服协助处理。
三、会话能力
1、输入主题,AI 自动生成文章
1)安装 python 库
a、streamlit —— 快速搭建 Web 应用的神器
- 作用:让你用纯
Python代码 几行就做出一个网页应用(比如聊天机器人、数据看板、AI 工具等),无需写HTML/CSS/JavaScript。 - 类比:就像“
Python版的简易网页框架”,专为数据科学家和AI开发者设计。
b、openai —— 调用大模型的标准客户端
- 作用:
OpenAI官方提供的Python SDK,用于调用GPT等模型。 - 但更重要的是:它已成为行业标准协议,阿里云 DashScope、Moonshot、DeepSeek 等都兼容这个接口!
c、python-dotenv —— 安全读取配置文件
- 作用:从
.env文件中加载环境变量(比如API密钥),避免把敏感信息(如sk-xxx)写死在代码里。 - 为什么需要?如果直接写
api_key = "sk-xxx"在代码中:- 一不小心提交到
GitHub→ 密钥泄露 → 被盗刷费用! - 团队协作时每个人密钥不同 → 需要频繁改代码
- 一不小心提交到
2)代码编写
# app.py
import os
import streamlit as st
from openai import OpenAI
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
api_key = os.getenv("DASHSCOPE_API_KEY") # 注意:这里建议改名为 DASHSCOPE_API_KEY,但保留也可
if not api_key:
st.error("请在环境变量中中设置 DASHSCOPE_API_KEY")
st.stop()
# 使用 OpenAI SDK 初始化客户端,指向 DashScope
client = OpenAI(
api_key = api_key,
base_url= "https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# 设置页面标题
st.set_page_config(page_title="📝 智能写作助手", layout="centered")
st.title("📝 智能写作助手")
st.markdown("基于通义千问(Qwen)的 AI 写作工具,输入主题,自动生成文章。")
# 用户输入
topic = st.text_input("请输入写作主题(例如:人工智能的未来)", placeholder="人工智能的未来")
# 生成按钮
if st.button("🚀 生成文章"):
if not topic.strip():
st.warning("请输入一个主题!")
else:
with st.spinner("正在生成内容,请稍候..."):
try:
prompt = f"""
你是一位专业的内容创作者,请围绕以下主题写一篇 300 字左右的短文:
主题:{topic}
要求:
- 语言流畅,逻辑清晰
- 包含开头、主体、结尾
- 不要使用 markdown 格式
- 直接输出正文
"""
# 调用 DashScope 的 Qwen 模型(通过 OpenAI SDK)
response = client.chat.completions.create(
model="qwen-max", # 支持 qwen-plus / qwen-max / qwen-turbo
messages=[{"role": "user", "content": prompt}],
temperature= 0.7,
max_tokens= 500,
)
content = response.choices[0].message.content
st.subheader("📖 生成结果")
st.write(content)
# 提供下载按钮
st.download_button(
label="💾 下载为 .txt",
data=content,
file_name=f"{topic}.txt",
mime="text/plain"
)
except Exception as e:
st.error(f"出错了:{str(e)}")
3)运行 http://localhost:8501/
└─[$] streamlit run qwen_first.py [16:38:42]
👋 Welcome to Streamlit!
If you'd like to receive helpful onboarding emails, news, offers, promotions,
and the occasional swag, please enter your email address below. Otherwise,
leave this field blank.
Email: healerjean@163.com
└─[$] streamlit run qwen_first.py [16:57:29]
You can now view your Streamlit app in your browser.
Local URL: http://localhost:8504
Network URL: http://10.254.65.167:8504
For better performance, install the Watchdog module:
$ xcode-select --install
$ pip install watchdog

4)打包部署(内网穿透)
-
mac安装ngrok-
brew install ngrok/ngrok/ngrok
-
-
配置
ngrokAuthtoken-
└─[$] ngrok config add-authtoken xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx [17:12:28] Authtoken saved to configuration file: /Users/zhangyujin1/Library/Application Support/ngrok/ngrok.yml
-
-
运行 web 服务
-
streamlit run qwen_first.py
-
-
启动
ngrok内网穿透-
ngrok http 8506 -
ngrok (Ctrl+C to quit) 🧠 Call internal services from your gateway: https://ngrok.com/r/http-request Session Status online Account healerjean@gmail.com (Plan: Free) Version 3.33.1 Region Japan (jp) Latency 64ms Web Interface http://127.0.0.1:4040 Forwarding https://pseudoamatorial-mee-flashingly.ngrok-free.dev -> http://localhost:8507 Connections ttl opn rt1 rt5 p50 p90 3 0 0.00 0.00 0.02 0.29 HTTP Requests ------------- 17:17:35.037 CST GET / 502 Bad Gateway 17:17:30.101 CST GET / 502 Bad Gateway 17:16:21.210 CST GET / 502 Bad Gateway
-
2、善用 Embedding,我们来给文本分类
1)什么是 Embedding?
Embedding是将一段文字变成一个“数字向量”,比如:
"我喜欢吃苹果" → [0.1, -0.3, 0.8, ...]
"我不喜欢香蕉" → [0.2, -0.4, 0.7, ...]
两个相似的句子,向量也相近。
2)案例-分成 2类
| 技术 | 作用 |
|---|---|
Embedding |
把文字变数字 |
| 向量相似度 | 找出相似内容 |
| 聚类算法 | 自动分组 |
# sentiment_clustering.py
import os
import numpy as np
from openai import OpenAI
from sklearn.cluster import KMeans
# 初始化 OpenAI 兼容客户端(指向阿里云 DashScope)
client = OpenAI(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx"
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# === 文本数据 ===
texts = [
"今天天气真好",
"阳光明媚,心情愉快",
"下雨了,有点烦",
"外面刮风了,很冷",
"我很开心,因为放假了"
]
# === 步骤1:获取 Embedding 向量 ===
print("正在获取文本向量...")
embeddings = []
for text in texts:
response = client.embeddings.create(
model="text-embedding-v2", # DashScope 官方 embedding 模型
input=text
)
embeddings.append(response.data[0].embedding)
# 转为 NumPy 数组(KMeans 需要)
X = np.array(embeddings)
# === 步骤2:KMeans 聚类(分 2 类) 42《银河系漫游指南》终极答案===
kmeans = KMeans(n_clusters=2, random_state=42)
labels = kmeans.fit_predict(X)
# === 步骤3:输出结果 ===
print("\n聚类结果:")
for i, label in enumerate(labels):
print(f"文本{i}: {texts[i]} -> 类别{label}")
└─[$] python3 qwen_first.py [17:41:36]
正在获取文本向量...
聚类结果:
文本0: 今天天气真好 -> 类别0
文本1: 阳光明媚,心情愉快 -> 类别0
文本2: 下雨了,有点烦 -> 类别1
文本3: 外面刮风了,很冷 -> 类别1
文本4: 我很开心,因为放假了 -> 类别0
2、文本聚类,让 AI 帮你做总结
不用训练模型,仅用 Qwen + 开源工具,实现自动会议纪要、新闻分类、长文摘要三大实用功能!
核心思路:两步走:
- 将结合
Embedding+Prompt Engineering,打造全自动文本处理流水线。
| 步骤 | 方法 |
|---|---|
| 1. 理解内容 | 用 Qwen 的 Embedding 获取语义向量 |
| 2. 生成摘要/聚类 | 用 Qwen 的 Chat 模型做智能总结 |
你爬取了 50 条新闻标题,想自动分组(如“科技”、“体育”、“财经”)。
# sentiment_clustering.py
import os
import numpy as np
from openai import OpenAI
from sklearn.cluster import KMeans
# 初始化 OpenAI 兼容客户端(指向阿里云 DashScope)
client = OpenAI(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx"
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# === 步骤 1:准备新闻标题 ===
news_titles = [
"华为发布新款 Mate60 手机",
"苹果股价创历史新高",
"NBA 总决赛湖人夺冠",
"央行宣布降准 0.5 个百分点",
"特斯拉上海工厂扩产",
"C罗加盟沙特联赛",
"英伟达市值突破万亿美元",
"美联储加息 25 个基点",
"梅西率队赢得世界杯",
"小米汽车明年量产",
"A股三大指数集体上涨",
"勇士队签下新秀合同"
]
# === 步骤 2:获取 Embedding 向量 ===
def get_embeddings(texts):
embeddings = []
for text in texts:
response = client.embeddings.create(
model="text-embedding-v2", # DashScope 官方 embedding 模型
input=text
)
embeddings.append(response.data[0].embedding)
return np.array(embeddings)
print("正在获取文本向量...")
vectors = get_embeddings(news_titles)
# === 步骤 3:KMeans 聚类(分 3 类)===
n_clusters = 3
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
labels = kmeans.fit_predict(vectors)
# 按标签分组
clusters = {}
for i, label in enumerate(labels):
if label not in clusters:
clusters[label] = []
clusters[label].append(news_titles[i])
# === 步骤 4:用 Qwen 为每个类别命名 ===
print("\n正在为每个类别生成名称...\n")
for label, titles in clusters.items():
# 取最多 3 条作为样本
sample_titles = "\n".join(titles[:3])
naming_prompt = f"""以下是一组新闻标题,请为这个类别起一个简洁的中文名称(2~4 个字):
{sample_titles}
只输出类别名称,不要任何解释、标点或额外内容。"""
response = client.chat.completions.create(
model="qwen-plus",
messages=[{"role": "user", "content": naming_prompt}],
temperature=0.3,
max_tokens=10
)
category_name = response.choices[0].message.content.strip().replace(" ", "").replace("”", "").replace("“", "")
print(f"【{category_name}】")
for t in titles:
print(f" - {t}")
print()
└─[$] python3 qwen_first.py [17:42:33]
正在获取文本向量...
正在为每个类别生成名称...
【新闻】
- 华为发布新款 Mate60 手机
- NBA 总决赛湖人夺冠
- C罗加盟沙特联赛
- 梅西率队赢得世界杯
- 勇士队签下新秀合同
【财经】
- 苹果股价创历史新高
- 央行宣布降准 0.5 个百分点
- 英伟达市值突破万亿美元
- 美联储加息 25 个基点
- A股三大指数集体上涨
【新能源车】
- 特斯拉上海工厂扩产
- 小米汽车明年量产
3、文本改写和内容审核
用
Qwen实现四大实用功能——敏感内容过滤、风格改写、SEO 优化、防抄袭检测,全部无需训练模型!
1)提示技巧
在真实业务中,你可能遇到:
- 🚫 用户发帖含辱骂、广告、政治敏感词?
- ✍️ 公司文案太生硬,想改成“小红书风格”?
- 🔍 写的公众号文章没人看,需要 SEO 优化?
- 📄 学生交的论文是不是抄的?
传统方案:
- 敏感词库(维护难、漏检多)
- 人工编辑(成本高)
- 查重系统(贵且不准)
| 功能 | 核心 Prompt 技巧 |
|---|---|
| 内容审核 | “你是一个审核员,请检查…” + JSON 输出 |
| 风格改写 | “改写成【XX】风格,要求…” |
| SEO 优化 | “你是一位 SEO 专家,请优化…” |
| 抄袭检测 | “判断两段文字是否抄袭,从…角度分析” |
2)智能内容审核(敏感词 + 风险识别
- 不要信任 AI 审核 100%→ 建议用于初筛,高风险内容仍需人工复核。
- 记录审核日志→ 便于事后审计和模型优化。
场景:用户在评论区输入一段文字,系统自动判断是否违规。
# sentiment_clustering.py
import os
from openai import OpenAI
import json # ✅ 关键:必须放在顶部!
# ==============================
# 第一步:初始化 OpenAI 兼容客户端(指向阿里云 DashScope)
# ==============================
# 从环境变量中读取 API 密钥(建议在 .env 中设置 DASHSCOPE_API_KEY)
client = OpenAI(
# 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx"
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# ==============================
# 第二步:定义内容安全审核函数
# ==============================
def check_content(text: str) -> dict:
"""
使用 Qwen 大模型对输入文本进行安全审核。
审核维度:
- 政治敏感
- 辱骂/人身攻击
- 广告/营销
- 色情低俗
- 虚假信息
返回标准 JSON 格式结果,便于程序解析。
"""
# 构造提示词(Prompt)
# 注意:这里用三重引号保留格式,f-string 插入待审核文本
prompt = f"""
你是一个内容安全审核员,请严格检查以下文本是否存在以下问题:
1. 政治敏感内容
2. 辱骂、人身攻击
3. 广告/营销信息
4. 色情低俗
5. 虚假信息
如果存在任何问题,请按 JSON 格式输出(不要任何额外文字):
{
"is_safe": false,
"risk_type": "广告",
"reason": "包含微信号推广"
}
如果完全安全,请输出(同样只输出 JSON):
{
"is_safe": true,
"risk_type": null,
"reason": null
}
待审核文本:
{text}
"""
try:
# 调用大模型生成审核结果
response = client.chat.completions.create(
model="qwen-max", # 使用 Qwen-Max(强推理能力,适合审核)
messages=[
{"role": "user", "content": prompt}
],
temperature=0.1, # 降低随机性,确保结果稳定
max_tokens=200, # 足够返回一个 JSON 即可
response_format={"type": "json_object"} # ⭐ 关键!强制模型输出合法 JSON
)
# 提取模型返回的文本内容
raw_content = response.choices[0].message.content.strip()
# 尝试解析为 JSON
result = json.loads(raw_content)
# 确保字段完整(防御性编程)
required_keys = {"is_safe", "risk_type", "reason"}
if not required_keys.issubset(result.keys()):
raise ValueError("缺少必要字段")
return result
except Exception as e:
# 如果模型返回非 JSON、解析失败或网络错误,返回安全失败
return {
"is_safe": False,
"risk_type": "系统错误",
"reason": f"审核异常: {str(e)}"
}
test_texts = [
"这个产品真垃圾,卖家是骗子!", # 预期:辱骂
"加我微信:xiaoming123,优惠券免费领", # 预期:广告
"今天天气不错,适合散步。" # 预期:安全
]
for text in test_texts:
print(f"原文: {text}")
result = check_content(text)
print(f"审核结果: {result}\n")
└─[$] python3 qwen_first.py [18:33:41]
原文: 这个产品真垃圾,卖家是骗子!
审核结果: {'is_safe': False, 'risk_type': '辱骂、人身攻击', 'reason': '包含对卖家的负面评价和侮辱性语言'}
原文: 加我微信:xiaoming123,优惠券免费领
审核结果: {'is_safe': False, 'risk_type': '广告', 'reason': '包含微信号推广'}
原文: 今天天气不错,适合散步。
审核结果: {'is_safe': True, 'risk_type': None, 'reason': None}


