为了提高问答「准确率」,有两个优化方向
1、增加训练集数据
2、增加提问上下文语料,答案就在其中
OpenAI 是不允许用户来训练数据的,他的 model 是固定且通用的。所以增加训练集数据并不可行。
使用chatgpt 嵌入,让chatgpt根据语料内容回答。
实际应用,产品客服、产品介绍、某专业技能问答。
我们只能使用方法
2 :提供提问上下文(context)。
在 openai 提供的能力中,可以在 prompt 中增加上下文语料,来提高 回复 准确率。
但是我们如何从自己的语料库(由语料片段组成)中,找到和提问相关(答案需要在上下文语料中)的 context 呢?
openai 提供了 Embedding 的接口,可以用 input (输入一段文字)来计算一坨 embedding 向量值。
我们可以通过将(语料片段的向量)与(问题的向量)取(最相似的向量),来判断问题和语料片段的相似(similarity)度,
这样我们在 prompt 里,把最相似的语料片段作为 context 放进 prompt ,就可以得到最正确的 completion。
1、管理语料
2、语料生成向量
3、语料调用openai 接口生成向量代码
import openai # for generating embeddings
import pandas as pd # for DataFrames to store article sections and embeddings
from openai_key import *
openai.api_key = openai_key
def vector(input):
response = openai.Embedding.create(
input=input,
model="text-embedding-ada-002"
)
return response['data'][0]['embedding']
input = 'i9CPU 内核和基本频率'
print (vector(input))
4、 余弦相似度计算
import numpy as np
from emb_diribo import *
# 计算计算余弦相似度
import numpy as np
from vector import *
# 计算计算余弦相似度
def cosine_similarity(vector1, vector2):
dot_product = np.dot(vector1, vector2)
norm1 = np.linalg.norm(vector1)
norm2 = np.linalg.norm(vector2)
return dot_product / (norm1 * norm2)
print (cosine_similarity(vector1, vector2))
完整流程