前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

一、我们学会和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] 对话消息列表,每个元素含 rolecontentrole: "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 是否启用流式响应(SSETrue 时返回 text/event-stream
stop strList[str] None 遇到指定字符串时停止生成 例:["\n\n", "用户:"]
seed int None 随机种子,用于结果可复现(调试用)
response_format Dict None 强制输出格式: {"type": "json_object"} ⚠️ 需在 system 中说明 JSON 结构
tools List[Dict] None 定义可调用的函数
tool_choice strDict "auto" 控制是否调用工具: • "auto":模型决定 • "none":不调用 • {"type": "function", "function": {"name": "xxx"}}:强制调用
user str None 用于标识终端用户(审计/限流)
  • 中文任务优先选 qwen-plusqwen-max
  • JSON 输出? 必须同时:
    1. 设置 "response_format": {"type": "json_object"}
    2. system 消息中明确 JSON schema
  • 流式输出? 设置 "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 主动兼容了 OpenAI API 协议,所以任何支持 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
            
    

image-20251128164113639

4)打包部署(内网穿透)

  • mac 安装 ngrok

    • brew install ngrok/ngrok/ngrok
      
  • 配置 ngrok Authtoken

    • └─[$] 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}

ContactAuthor