AI模型(一)Embedding和Completion

278 阅读6分钟

情感分析

传统模式

  1. 算法
    1. 朴素贝叶斯与逻辑回归
  2. 特征工程
    1. 提取关键词
    2. 去除停顿词
    3. 等等
  3. 机器学习
    1. 数据集切分成训练(Training)、验证(Validation)、测试(Test)三组数据

大语言模型 LLM

Embedding 转换向量

  • Embedding:把任何指定的文本变成一个大模型下的向量,也就是一组固定长度的参数来代表任何一段文本
    • 再计算”好评”和“差评”这两个字的Embedding
    • 给定一个文本,计算这个文本距离”好评”和“差评”的余弦距离
      • 拿这个Embedding和“好评”之间的相似度,去减去和“差评”之间的相似度,就会得到一个分数。如果这个分数大于0,那么说明我们的评论和“好评”的距离更近,我们就可以判断它为好评。如果这个分数小于0,那么就是离差评更近,我们就可以判断它为差评。
import openai
import os
from openai.embeddings_utils import cosine_similarity, get_embedding

# 获取访问open ai的密钥
openai.api_key = os.getenv("OPENAI_API_KEY")
# 选择使用最小的ada模型
EMBEDDING_MODEL = "text-embedding-ada-002"

# 获取"好评"和"差评"的
positive_review = get_embedding("好评")
negative_review = get_embedding("差评")

positive_example = get_embedding("买的银色版真的很好看,一天就到了,晚上就开始拿起来完系统很丝滑流畅,做工扎实,手感细腻,很精致哦苹果一如既往的好品质")
negative_example = get_embedding("降价厉害,保价不合理,不推荐")

def get_score(sample_embedding):
  return cosine_similarity(sample_embedding, positive_review) - cosine_similarity(sample_embedding, negative_review)

positive_score = get_score(positive_example)
negative_score = get_score(negative_example)

print("好评例子的评分 : %f" % (positive_score))
print("差评例子的评分 : %f" % (negative_score))
  • 输出
好评例子的评分 : 0.070963
差评例子的评分 : -0.081472

Completion 生成

import openai
import os

openai.api_key = os.environ.get("OPENAI_API_KEY")
COMPLETION_MODEL = "text-davinci-003"

prompt = '请你用朋友的语气回复给到客户,并称他为“亲”,他的订单已经发货在路上了,预计在3天之内会送达,订单号2021AEDG,我们很抱歉因为天气的原因物流时间比原来长,感谢他选购我们的商品。'

def get_response(prompt, temperature = 1.0):
    completions = openai.Completion.create (
        engine=COMPLETION_MODEL,
        prompt=prompt,
        max_tokens=1024,
        n=1,
        stop=None,
        temperature=temperature,
    )
    message = completions.choices[0].text
    return message

第一个参数是 engine,也就是我们使用的是Open AI的哪一个引擎,这里我们使用的是 text-davinci-003,也就是现在可以使用到的最擅长根据你的指令输出内容的模型。当然,也是调用成本最高的模型。

第二个参数是 prompt,自然就是我们输入的提示语。接下来,我还会给你更多使用提示语解决不同需求的例子。

第三个参数是 max_tokens,也就是调用生成的内容允许的最大token数量。你可以简单地把token理解成一个单词。实际上,token是分词之后的一个字符序列里的一个单元。有时候,一个单词会被分解成两个token。比如,icecream是一个单词,但是实际在大语言模型里,会被拆分成 ice 和 cream 两个token。这样分解可以帮助模型更好地捕捉到单词的含义和语法结构。一般来说,750个英语单词就需要1000个token。我们这里用的 text-davinci-003 模型,允许最多有4096个token。需要注意,这个数量既包括你输入的提示语,也包括AI产出的回答,两个加起来不能超过4096个token。比如,你的输入有1000个token,那么你这里设置的 max_tokens 就不能超过 3096。不然调用就会报错。

第四个参数 n,代表你希望AI给你生成几条内容供你选择。在这样自动生成客服内容的场景里,我们当然设置成1。但是如果在一些辅助写作的场景里,你可以设置成3或者更多,供用户在多个结果里面自己选择自己想要的。

第五个参数 stop,代表你希望模型输出的内容在遇到什么内容的时候就停下来。这个参数我们常常会选用 "\n\n"这样的连续换行,因为这通常意味着文章已经要另起一个新的段落了,既会消耗大量的token数量,又可能没有必要。我们在下面试了一下,将“,”作为stop的参数,你会发现模型在输出了“亲”之后就停了下来。

temperature 随机度,0-2之间的浮点数,2表示随机越大

智能客服

import openai
import os

openai.api_key = os.environ["OPENAI_API_KEY"]

def ask_gpt3(prompt):
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=512,
        n=1,
        stop=None,
        temperature=0.5,
    )

    message = response.choices[0].text.strip()
    return message

print("你好,我是一个聊天机器人,请你提出你的问题吧?")

questions = []
answers = []

def generate_prompt(prompt, questions, answers):
    num = len(answers)
    for i in range(num):
        prompt += "\n Q : " + questions[i]
        prompt += "\n A : " + answers[i]
    prompt += "\n Q : " + questions[num] + "\n A : "
    return prompt

while True:
    user_input = input("> ")
    questions.append(user_input)
    if user_input.lower() in ["bye", "goodbye", "exit"]:
        print("Goodbye!")
        break

    prompt = generate_prompt("", questions, answers)

    answer = ask_gpt3(prompt)
    print(answer)
    answers.append(answer)

判断情感问题

prompts = """判断一下用户的评论情感上是正面的还是负面的
评论:买的银色版真的很好看,一天就到了,晚上就开始拿起来完系统很丝滑流畅,做工扎实,手感细腻,很精致哦苹果一如既往的好品质
情感:正面

评论:随意降价,不予价保,服务态度差
情感:负面
"""

good_case = prompts + """
评论:外形外观:苹果审美一直很好,金色非常漂亮
拍照效果:14pro升级的4800万像素真的是没的说,太好了,
运行速度:苹果的反应速度好,用上三五年也不会卡顿的,之前的7P用到现在也不卡
其他特色:14pro的磨砂金真的太好看了,不太高调,也不至于没有特点,非常耐看,很好的
情感:
"""

print(get_response(good_case)) // 正面
  • 上面这个“给一个任务描述、给少数几个例子、给需要解决的问题”这样三个步骤的组合,也是大语言模型里使用提示语的常见套路。一般我们称之为 Few-Shots Learning(少样本学习),也就是给一个或者少数几个例子,AI就能够举一反三,回答我们的问题。

  • 三个例子,第一个是给AI一个明确的指令,让它帮我重写一段话。

  • 第二个,是将整个对话的历史记录都发送出去,并且通过Q和A提示AI这是一段对话,那么AI自然能够理解整个上下文,搞清楚新的问题是指“蚝油牛肉怎么做”而不是“哪里买或者怎么吃”。

  • 而第三个例子,我们则是给了AI几个正面情感和负面情感的例子,它就能够直接对新的评论做出准确的情感判断。