提示词实际案例之情感分析
如何用Few-shot学习构建情感分析AI(附完整代码拆解)
一、需求分析:我是如何思考的
某天,产品经理找到我说:“我们需要一个能判断用户情感倾向的功能,比如用户说‘你在干嘛’,能知道他是喜欢还是不喜欢。”
听到这个需求,我的第一反应不是马上写代码,而是问自己三个问题:
-
问题的本质是什么? → 文本二分类问题(喜欢/不喜欢)
-
我有什么资源? → 有少量标注数据,没有大规模训练集
-
技术选型是什么? → 大语言模型 + Few-shot学习
为什么选择Few-shot?因为传统机器学习需要大量标注数据,而深度学习模型训练成本高。利用大语言模型的上下文学习能力,只需给几个例子就能完成任务。
二、代码逐行拆解
第一步:肌肉记忆 - 初始化大模型客户端
python
from openai import OpenAI
llm = OpenAI(
api_key="sk-b69a90cd85474c03b2309cf8d8554e94",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
设计思路:
-
使用OpenAI兼容接口,方便后续切换不同模型提供商
-
这里用了阿里云的通义千问(dashscope),因为国内访问更稳定
-
为什么叫“肌肉记忆”?因为这是我每次做大模型项目都会写的模板代码
第二步:构建Few-shot(少样本) 示例 - 核心创新点
python
def init_history_message():
examples = {
"喜欢": ["你在干嘛", "有没有空,出来玩"],
"不喜欢": ["没空", "别来烦我"]
}
system_prompt = "你是一个情感专家,你需要根据用户输入的文本,判断用户的情感倾向,输出'喜欢'或'不喜欢'"
history_message = [{"role": "system", "content": system_prompt}]
for label, texts in examples.items():
for text in texts:
history_message.append({"role": "user", "content": text}) 用户的问题
history_message.append({"role": "assistant", "content": label}) ai的标准答案
return history_message
上面这段for循环的目的是将例题转换为对话格式,让AI通过看"问题→答案"的对话示例,学会如何回答问题。
设计思路的关键点:
-
为什么用字典存储示例?
-
键是标签(喜欢/不喜欢),值是具体文本
-
这种结构让我能直观地看到每个类别的示例
-
方便后续增加更多类别或示例
-
-
为什么要把示例放在system prompt之后?
-
System prompt定义角色和任务
-
Few-shot示例展示具体怎么做
-
符合“先给规则,再给例子”的教学逻辑
-
-
示例选择的艺术:
-
“你在干嘛” - 表面是询问,实则是关心(喜欢)
-
“没空” - 直接拒绝(不喜欢)
-
选择了有代表性但不复杂的例子
-
第三步:模型调用 - 批量处理逻辑
python
def model_call(texts):
for text in texts:
res = llm.chat.completions.create(
model='qwen-plus',
messages=init_history_message() + [{"role": "user", "content": text}]
) 案例 新题
print(res.choices[0].message.content)
为什么这样设计:
-
循环处理而非批量请求
-
大模型的chat接口通常一次处理一个对话
-
循环处理便于观察每个样本的输出
-
方便后续添加错误处理逻辑
-
-
动态拼接messages
-
每次调用都重新获取history_message
-
确保每个预测都有相同的Few-shot上下文
-
避免多个样本之间的相互干扰
-
-
messages的构造顺序很重要:
text
system prompt → Few-shot示例(user-assistant对) → 当前要预测的文本
这就像是:先告诉模型规则,再给几个例题,最后让它做新题。
第四步:主函数 - 测试用例
python
if __name__ == '__main__':
texts = ['我们只是朋友', '你在干嘛', '我恨你']
model_call(texts)
测试用例的选择逻辑:
-
'我们只是朋友'- 委婉拒绝,介于喜欢和不喜欢之间 -
'你在干嘛'- 已经在示例中,验证模型是否记住 -
'我恨你'- 强烈负面情感,测试泛化能力
三、代码执行的完整流程
让我用思维导图的方式展示整个流程:
text
用户输入:"我们只是朋友"
↓
构造messages = [
{"role":"system","content":"你是情感专家..."},
{"role":"user","content":"你在干嘛"},
{"role":"assistant","content":"喜欢"},
{"role":"user","content":"没空"},
{"role":"assistant","content":"不喜欢"},
{"role":"user","content":"我们只是朋友"} ← 当前输入
]
↓
调用通义千问模型
↓
模型基于示例推理 → 输出"不喜欢"
以下是完整代码:
#第一步: ,默写模板(肌肉记忆)
# 模块1: 初始化函数
from openai import OpenAI
llm = OpenAI (
api_key="sk-b69a90cd85474c03b2309cf8d8554e94",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
def init_history_message():
examples = {
"喜欢": ["你在干嘛","有没有空,出来玩"],
"不喜欢": ["没空","别来烦我"]
}
system_prompt = "你是一个情感专家,你需要根据用户输入的文本,判断用户的情感倾向,输出'喜欢'或'不喜欢'"
history_message = [{"role":"system","content":system_prompt}]
for label,texts in examples.items():
for text in texts:
history_message.append({"role":"user","content":text})
history_message.append({"role":"assistant","content":label})
return history_message
# 模块2 : 模型调用函数
def model_call(texts):
for text in texts:
res = llm.chat.completions.create(
model = 'qwen-plus',
messages = init_history_message()+ [{"role":"user","content": text }]
)
print(res.choices[0].message.content)
if __name__ == '__main__':
texts = ['我们只是朋友', '你在干嘛', '我恨你']
model_call(texts)
恋爱需谨慎,爱情有风险!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)