【大模型】-向量数据库

文章目录

向量数据库

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)
相关推荐
魔镜前的帅比3 小时前
LangGraph(流程化控制)
python·langchain
北冥有一鲲4 小时前
LangChain 框架前世今生:从“万能接口”到“AI 应用全家桶”
人工智能·chatgpt·langchain
长空任鸟飞_阿康16 小时前
LangGraph 技术详解:基于图结构的 AI 工作流与多智能体编排框架
人工智能·python·langchain
huohuopro19 小时前
LangChain | LangGraph V1教程 #3 从路由器到ReAct架构
前端·react.js·langchain
沛沛老爹21 小时前
Web开发者快速上手AI Agent:基于LangChain的提示词应用优化实战
人工智能·python·langchain·提示词·rag·web转型
周末程序猿21 小时前
RAG实战|8种RAG架构浅析
langchain·aigc
春天的菠菜1 天前
【LangChain第3章】LangChain使用之Chains
人工智能·langchain
长空任鸟飞_阿康1 天前
LangChain 技术栈全解析:从模型编排到 RAG 实战
前端·python·langchain
沛沛老爹1 天前
Web开发者进阶AI Agent:LangChain提示词模板与输出解析器实战
人工智能·ai·langchain·llm·agent·提示词·web转型