【大模型】-向量数据库

文章目录

向量数据库

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)
相关推荐
云和数据.ChenGuang29 分钟前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
染指11108 小时前
162.Agent-LangGraph-检查点的作用
人工智能·python·langchain·agents
叼烟扛炮9 小时前
[LangChain] 学习笔记(02):LCEL 链式调用与动态模型配置实战
服务器·开发语言·网络·笔记·学习·langchain
YIAN10 小时前
RAG 学到最后,我真正学会的不是“检索”,而是让系统知道自己缺什么
langchain·node.js·llm
lee_curry12 小时前
第十周完整学习笔记:继续升级为“检索更准、权限安全、索引可维护、失败可恢复、长期可运行”的企业级 RAG 系统
python·ai·langchain·agent·langgraph
破烂三角裤1 天前
AI 没有记忆?我给儿童故事 Agent 搭了一套“长期记忆”系统
langchain
云和数据.ChenGuang1 天前
光哥说Python 异常深度解析:从异常模型到工程化实践
java·前端·人工智能·python·langchain
Maiko Star1 天前
【HM-LC】LangChain RAG查询优化详解:查询重写、混合检索与重排序实战
langchain·rag
2501_913061341 天前
MCP核心能力
langchain
小林ixn1 天前
从线性 RAG 到 Agentic RAG:用 LangGraph 搭一个会判断、会纠错、会兜底的检索闭环
langchain·llm·agent