文章目录
-
- 向量数据库
-
- 1.embedings使用
- [2. 相似度检索](#2. 相似度检索)
向量数据库
1.embedings使用
python
# 先安装必要的库(如果你还没安装的话)
# !pip install langchain-openai openai
from langchain_openai import OpenAIEmbeddings
import os
# 设置你的 OpenAI API 密钥(建议使用环境变量)
os.environ["OPENAI_API_KEY"] = "你的-api-key-放在这里"
# 初始化嵌入模型
embeddings_model = OpenAIEmbeddings()
# 嵌入多段文本
embeddings = embeddings_model.embed_documents([
"嗨!",
"哦,你好!",
"你叫什么名字?",
"我的朋友们叫我World",
"Hello World! "
])
# 打印结果:文本数量和第一段文本的向量维度
print(len(embeddings), len(embeddings[0]))
#输出结果
len(embeddings):表示你传入的文本数量(这里是 5)。
len(embeddings[0]):表示第一段文本"嗨!"对应的嵌入向量维度,对于 OpenAI 的 text-embedding-ada-002 模型来说,通常是 1536 维。
如果你想嵌入单个文本(而不是列表),可以使用 embed_query 方法:
python
single_embedding = embeddings_model.embed_query("你好!")
print(len(single_embedding)) # 也会是 1536
2. 相似度检索
python
import numpy as np
from langchain_community.embeddings import DashScopeEmbeddings
from numpy.linalg import norm
# 模拟一个嵌入生成函数(实际应用中应该使用真实的嵌入模型)
# def get_embedding(text):
# """
# 模拟生成文本的嵌入向量。
# 实际使用时,应该替换为真实的嵌入模型(如OpenAI, Sentence-BERT等)。
# """
# # 这里为了演示,生成一个随机的1536维向量(模拟OpenAI的嵌入维度)
# np.random.seed(hash(text) % 10000) # 让相同文本产生相同向量
# return np.random.randn(1536)
def get_embedding(text):
"""
使用 LangChain 封装的 DashScopeEmbeddings
"""
# 初始化通义嵌入模型
embeddings = DashScopeEmbeddings(
model="text-embedding-v3",
dashscope_api_key="sk-秘钥"
)
embedding_vector = embeddings.embed_query(text)
return embedding_vector
def cosine_similarity(vec1, vec2):
"""
计算两个向量之间的余弦相似度。
"""
# 将列表转换为numpy数组
vec1 = np.array(vec1)
vec2 = np.array(vec2)
# 计算余弦相似度
dot_product = np.dot(vec1, vec2)
norm_product = norm(vec1) * norm(vec2)
if norm_product == 0:
return 0
return dot_product / norm_product
def search_documents(query, documents):
"""
在文档集合中搜索与查询最相似的文档。
参数:
query: 查询字符串
documents: 文档列表
返回:
(最相似的文档, 相似度得分)
"""
# 调用 get_embedding 函数生成查询字符串的嵌入向量 query_embedding。
query_embedding = get_embedding(query)
# 对每个文档调用 get_embedding 函数生成文档的嵌入向量,存储在 document_embeddings 列表中。
document_embeddings = [get_embedding(doc) for doc in documents]
# 计算查询嵌入向量与每个文档嵌入向量之间的余弦相似度,存储在 similarities 列表中
similarities = [cosine_similarity(query_embedding, doc_embedding)
for doc_embedding in document_embeddings]
# 找到相似度最高的文档的索引 most_similar_index。
most_similar_index = similarities.index(max(similarities))
# 返回相似度最高的文档和相似度得分。
return documents[most_similar_index], max(similarities)
# 测试文本搜索功能
if __name__ == "__main__":
documents = [
"OpenAI的ChatGPT是一个强大的语言模型。",
"天空是蓝色的,阳光灿烂。",
"人工智能正在改变世界。",
"Python是一种流行的编程语言。"
]
query = "人工智能"
# 执行搜索
result, score = search_documents(query, documents)
print(f"查询: '{query}'")
print(f"最相似的文档: '{result}'")
print(f"相似度得分: {score:.4f}")
# 显示所有文档的相似度
print("\n所有文档相似度:")
query_embedding = get_embedding(query)
for i, doc in enumerate(documents):
doc_embedding = get_embedding(doc)
similarity = cosine_similarity(query_embedding, doc_embedding)
print(f"文档 {i+1}: {doc} (相似度: {similarity:.4f})")
#输出
查询: '人工智能'
最相似的文档: '人工智能正在改变世界。'
相似度得分: 0.7738
所有文档相似度:
文档 1: OpenAI的ChatGPT是一个强大的语言模型。 (相似度: 0.5928)
文档 2: 天空是蓝色的,阳光灿烂。 (相似度: 0.4756)
文档 3: 人工智能正在改变世界。 (相似度: 0.7738)
文档 4: Python是一种流行的编程语言。 (相似度: 0.5269)