如何用Few-shot学习构建情感分析AI(附完整代码拆解)

一、需求分析:我是如何思考的

某天,产品经理找到我说:“我们需要一个能判断用户情感倾向的功能,比如用户说‘你在干嘛’,能知道他是喜欢还是不喜欢。”

听到这个需求,我的第一反应不是马上写代码,而是问自己三个问题:

  1. 问题的本质是什么? → 文本二分类问题(喜欢/不喜欢)

  2. 我有什么资源? → 有少量标注数据,没有大规模训练集

  3. 技术选型是什么? → 大语言模型 + 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通过看"问题→答案"的对话示例,学会如何回答问题。

设计思路的关键点:

  1. 为什么用字典存储示例?

    • 键是标签(喜欢/不喜欢),值是具体文本

    • 这种结构让我能直观地看到每个类别的示例

    • 方便后续增加更多类别或示例

  2. 为什么要把示例放在system prompt之后?

    • System prompt定义角色和任务

    • Few-shot示例展示具体怎么做

    • 符合“先给规则,再给例子”的教学逻辑

  3. 示例选择的艺术:

    • “你在干嘛” - 表面是询问,实则是关心(喜欢)

    • “没空” - 直接拒绝(不喜欢)

    • 选择了有代表性但不复杂的例子

第三步:模型调用 - 批量处理逻辑

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)

为什么这样设计:

  1. 循环处理而非批量请求

    • 大模型的chat接口通常一次处理一个对话

    • 循环处理便于观察每个样本的输出

    • 方便后续添加错误处理逻辑

  2. 动态拼接messages

    • 每次调用都重新获取history_message

    • 确保每个预测都有相同的Few-shot上下文

    • 避免多个样本之间的相互干扰

  3. 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)

  恋爱需谨慎,爱情有风险! 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐