You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将Cohere生成的文本嵌入向量与对应原文匹配并存储至数据库

如何将Cohere生成的文本嵌入向量与对应原文匹配并存储至数据库

Hey,看起来你已经搞定了PDF文本提取和段落拆分的工作,接下来咱们只需要把Cohere生成的嵌入向量和对应的原文绑定,然后存储到Qdrant数据库里就大功告成了。我帮你把脚本补全,同时把关键步骤给你讲清楚:

第一步:补全客户端初始化与核心逻辑

首先咱们需要初始化Cohere客户端来生成嵌入,同时配置Qdrant客户端准备存储。另外要注意,生成嵌入的时候要和对应的原文段落一一对应,这样后续检索的时候才能找回原文内容。

补全后的完整脚本如下:

import os
import cohere
import time

from pypdf import PdfReader
from dotenv import load_dotenv
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct

load_dotenv()

docsFolder='./docs'

def getTextFromPDF(fileName):
    text = ""
    reader = PdfReader(fileName)
    for page in reader.pages:
        text += page.extract_text() + "\n"
    return text

def getPhrases(docsFolder):
    phrases=[]

    with os.scandir(docsFolder) as it:
        for entry in it:
            if not entry.name.startswith('.') and entry.is_file():
                text=getTextFromPDF(docsFolder+"/"+entry.name)
                passages = [p.strip() for p in text.split("\n\n") if p.strip()]
                phrases.extend(passages)

    return phrases

# 初始化Cohere客户端(从环境变量读取API密钥)
co = cohere.Client(os.getenv("COHERE_API_KEY"))
# 初始化Qdrant客户端(这里用本地Qdrant实例,你也可以换成云端地址)
qdrant_client = QdrantClient(host="localhost", port=6333)

# 创建Qdrant集合(如果不存在的话)
collection_name = "pdf_document_embeddings"
if not qdrant_client.collection_exists(collection_name=collection_name):
    qdrant_client.create_collection(
        collection_name=collection_name,
        vectors_config=VectorParams(size=1024, distance=Distance.COSINE),  # Cohere嵌入默认是1024维
    )

start = time.perf_counter()
phrases = getPhrases(docsFolder)
print(f"共提取到 {len(phrases)} 个段落")

# 批量生成嵌入(Cohere支持批量处理,效率更高)
embeddings_response = co.embed(
    texts=phrases,
    model="embed-english-v3.0",  # 推荐用v3版本的模型,效果更好
    input_type="search_document"  # 标注是用于检索的文档,模型会优化嵌入效果
)
embeddings = embeddings_response.embeddings

# 将原文和向量打包成Qdrant需要的PointStruct格式
points = [
    PointStruct(
        id=i,
        vector=embeddings[i],
        payload={"original_text": phrases[i]}  # 把原文存在payload里,方便后续检索后查看
    )
    for i in range(len(phrases))
]

# 批量上传到Qdrant
qdrant_client.upsert(
    collection_name=collection_name,
    points=points
)

end = time.perf_counter()
print(f"所有段落嵌入生成并存储完成,耗时: {end - start:.2f} 秒")

关键细节说明

  • 嵌入与原文的绑定:通过循环索引把每个段落的文本和对应的嵌入向量一一对应,然后存入Qdrant的payload字段,这样后续用向量检索时,就能直接拿到对应的原文内容。
  • Qdrant集合配置:Cohere的embed-english-v3.0模型生成的向量是1024维的,所以集合的vectors_configsize要设为1024,距离度量用余弦相似度(Distance.COSINE)是文本检索场景的常用选择。
  • 批量处理:用Cohere的批量嵌入接口一次性处理所有段落,比单个生成效率高很多;Qdrant的upsert也是批量上传,减少网络请求开销。
  • 环境变量配置:确保你的.env文件里已经配置了COHERE_API_KEY,如果用云端Qdrant的话,还要加上Qdrant的API密钥和地址。

备注:内容来源于stack exchange,提问作者Dimitrios Desyllas

火山引擎 最新活动