如何将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_config里size要设为1024,距离度量用余弦相似度(Distance.COSINE)是文本检索场景的常用选择。 - 批量处理:用Cohere的批量嵌入接口一次性处理所有段落,比单个生成效率高很多;Qdrant的
upsert也是批量上传,减少网络请求开销。 - 环境变量配置:确保你的
.env文件里已经配置了COHERE_API_KEY,如果用云端Qdrant的话,还要加上Qdrant的API密钥和地址。
备注:内容来源于stack exchange,提问作者Dimitrios Desyllas




