上节课当中,给大家介绍了文本向量化的方法,在这个问答的项目当中,向量化之后,还需要做一个相似文本的召回。这节课我们先用一种直观的方法,来实现这个召回的过程。

1、查询语句向量化

# openai_06_retrieval.py
from openai import OpenAI
from dotenv import load_dotenv
import numpy as np

load_dotenv()
client = OpenAI()

query = '感冒吃什么药效果好?可以吃阿莫西林吗?'

# 查询语句向量化
query_resp = client.embeddings.create(
    model="text-embedding-ada-002",
    input=query
)

query_vec = np.array(query_resp.data[0].embedding)

2、备选文本向量化

# 备选文本向量化
question_texts = [
    '什么叫感冒? / 感冒是一种什么病?',
    '感冒一般是由什么引起的?/ 什么会导致感冒?',
    '感冒会有哪些症状?/ 感冒有哪些临床表现?',
    '感冒吃什么药好得快?/ 感冒怎么治?',
    '得了感冒去医院挂什么科室的号?',
    '感冒要怎么预防?',
    '感冒换着有什么禁忌?/ 感冒不能吃什么?',
    '感冒要做哪些检查?',
    '感冒能治好吗?/ 感冒治好的几率有多大?',
    '感冒的并发症有哪些?',
    '阿莫西林能治那些病?'
]

question_resp = client.embeddings.create(
    model="text-embedding-ada-002",
    input=question_texts
)

question_vecs = []
for item in question_resp.data:
    question_vecs.append(np.array(item.embedding))

3、计算欧式距离

距离越小,相似度越高,取前三条最相似的文本。

# 计算欧式距离,距离越小,相似度越高
import numpy as np

l2_distances = np.linalg.norm(query_vec - question_vecs, axis=1)

closest_indices = np.argsort(l2_distances)[:3]
# print(closest_indices)

for idx in closest_indices:
    print(question_texts[idx])

好的,到目前为止,关于 OpenAI 大模型调用的方法,就基本给大家讲完了,下节课,就正式进入 LangChain 框架部分的学习,其他大模型的内容,会在项目成型之后,再做补充。

本文链接:http://www.ichenhua.cn/edu/note/688

版权声明:本文为「陈华编程」原创课程讲义,请给与知识创作者起码的尊重,未经许可不得传播或转售!