现在的gpt应用基本都实现了这个场景的应用,比如:
- 联网搜索,根据网上找到的内容来回答你的内容,像bing和kimi或者其他AI搜索引擎
- 智能客服,把网站里的内容或者相关的其他什么资料预置到系统中,提高回答的质量
在这些场景下,不再通过关键词的匹配,而是通过语意的匹配。
比方说你输入的关键字是【车没油了怎么办】,通过关键词匹配可能需要对应的结果里要有【车没油了怎么办】对应的关键词,通过语意匹配的话可能能找到更适合你但是没有这几个关键词的结果,比方说直接给你几个加油站的点位。当然这里只是举个例子。
举这些例子应该比较容易理解这一块场景的应用。
写之前叠个甲,这篇博客的内容是比较早期的实践了,23年底听说出现了RAG这一项更厉害的技术,具体更厉害在哪里还没研究过,等有空研究的时候写出来分享一下。
所以本篇博客分享的内容可能有一些过时,但肯定是能用的,而且手动实现也更能清楚这里面最基本的原理。
核心在于GPT模型的embedding方法,embedding会将文本转化成向量(其实图片也可以),然后用户给出文本或者图片内容的时候需要将这部分的内容再embedding一次,也得到向量,通过向量的对比获取到相似的内容。
注意embedding方法是模型提供的,所以调用方式会有所不同,所以下面就不给出具体的代码展示了,另外同一内容embedding出来的结果也会根据模型不同会有所差距。并且embedding需要调用接口消耗token。
举个????:
预先在平台置入下面的内容
实际的技术过程会需要把知识库的内容通过embedding方法转化成向量。就是把【把十二生肖过一遍需要多少年?正确答案是13.5年,因为鸡年要过两年半】转化成类似[-0.00024867404135875404, -0.011203940957784653, -0.007343926001340151, -0.012206885032355785]这样格式的数据,并存储起来。这个过程需要注意对长文本的切割,因为太长会导致请求不了embedding接口。
等到有人问【把十二生肖过一遍需要多少年?】的时候,需要把这句话再embedding成上面那种格式的数据。
然后再进行向量对比,一般来说模型所有者会提供一个免费的方法供你在本地运行,如OpenAI官方提供了distances_from_embeddings(input_vectors, knowledge_vectors, distance_metric)
函数,input_vectors
是用户输入的内容转化成的向量,knowledge_vectors
是系统预置的知识库内容转化成的向量,是数组格式的,distance_metric
是对比方式,一般用cosine
余弦对比,这个不会消耗token。
这个函数会返回向量相关的距离,挑离得比较近的内容,预置到system里去做gpt参考内容的回答就可以了,然后发起大概这样的请求:
{
[{"role": "user", "content": "把十二生肖过一遍需要多少年?"}],
[{"role": "system", "content": "把十二生肖过一遍需要多少年?正确答案是13.5年,因为鸡年要过两年半"}]
}
GPT就会给出下面这样的回答: