Pinecone + ModelRiver

借助具备自动故障转移接力保障的 ModelRiver 去打造嵌入表示层。并将大面积生产查询向量丢往松绑运维、强主搜向量引擎 Pinecone 这个强助落库用作后方支撑去给打造生成。

概览

Pinecone 是一款为主研针对 AI 生态落地深度全优化的非需用户下水接管自底管代的全托管大引擎搜索服务。通过让这个数据仓能手去吃喝那些出自并是由着挂载着并有安全冗灾保障打出走出的这些来自于 ModelRiver 端那这等同出的高质量生成件,即可打造一条从获取入本与查录乃至是生成时发力都在在不落宕之绝绝环境下的好产物。


快速上手

安装相关依赖件

Bash
pip install pinecone openai

初始化配置设置

PYTHON
1from pinecone import Pinecone, ServerlessSpec
2from openai import OpenAI
3 
4# 通过向 ModelRiver 挂联开启一个通用的调用口 (结合用于 embeddings 抽取以及 chat 问答)
5client = OpenAI(
6 base_url="https://api.modelriver.com/v1",
7 api_key="mr_live_YOUR_API_KEY",
8)
9 
10# 接入向 Pinecone 的使用接洽口
11pc = Pinecone(api_key="YOUR_PINECONE_API_KEY")
12 
13# 开拓一张只在初跑时创发一次用做日后的主检索数据底盘索引表
14pc.create_index(
15 name="knowledge-base",
16 dimension=1536, # 确保此大小能够严格匹配您的生成基座产出的数据维长值设定
17 metric="cosine",
18 spec=ServerlessSpec(cloud="aws", region="us-east-1"),
19)
20 
21index = pc.Index("knowledge-base")

原有文本文料的吸纳并存收落存 (Ingest documents)

PYTHON
1def embed_and_upsert(texts: list[str], ids: list[str], metadata: list[dict] = None):
2 """一肩挑下利用 ModelRiver 发打请求且一并在内同时存盘向在端 Pinecone 工作包下的这一步骤大全。"""
3 response = client.embeddings.create(
4 model="my-embedding-workflow", # 你设定好且专属用于表示调用的工作流工作道标号
5 input=texts,
6 )
7 
8 vectors = []
9 for i, embedding in enumerate(response.data):
10 vector = {
11 "id": ids[i],
12 "values": embedding.embedding,
13 "metadata": metadata[i] if metadata else {"text": texts[i]},
14 }
15 vectors.append(vector)
16 
17 index.upsert(vectors=vectors)
18 return len(vectors)
19 
20# 吸进吃走所有的文档带文本
21documents = [
22 "ModelRiver 能够在各个提供商平台间路由处理收纳下的 AI 请求指令。",
23 "工作流用作于布列配置关于模型商的备用以及应急保障配置策略。",
24 "结构化的护框设定能够确保持续并产出不会被轻易毁盘出偏的可保稳之物。",
25 "请求分析日志能够呈现一整全不漏丝毫能打在眼皮底下对全链路观测的透观能力集。",
26]
27 
28ids = [f"doc-{i}" for i in range(len(documents))]
29metadata = [{"text": doc, "source": "docs"} for doc in documents]
30 
31embed_and_upsert(documents, ids, metadata)

对盘查询请求提审响应下答出出库答查 (Query (RAG))

PYTHON
1def ask(question: str, top_k: int = 3) -> str:
2 """去这先走入去 Pinecone 捞出语境文档相关料,随之经由打 ModelRiver 端把料拿来借着大本子生成这总终落出底回复。"""
3 
4 # 第 1 步:将问出作文字生成落做标去那查询的向量题
5 query_embedding = client.embeddings.create(
6 model="my-embedding-workflow",
7 input=[question],
8 ).data[0].embedding
9 
10 # 第 2 步. 送去丢给入到那端去调 Pinecone 将大查找去拉出来
11 results = index.query(vector=query_embedding, top_k=top_k, include_metadata=True)
12 
13 # 第 3 步. 从刚查里得提获取文关联背景打结凑建做做语境的包
14 context = "\n\n".join([match.metadata["text"] for match in results.matches])
15 
16 # 第 4 步. 向生成出终点请求答口下派令去借道 ModelRiver 收回答
17 response = client.chat.completions.create(
18 model="my-chat-workflow",
19 messages=[
20 {"role": "system", "content": f"依据语境下作答:\n\n{context}"},
21 {"role": "user", "content": question},
22 ],
23 )
24 
25 return response.choices[0].message.content
26 
27answer = ask("How does ModelRiver handle failover?")
28print(answer)

以打成组大批之数量过发传包这操作 (Batch ingestion)

PYTHON
1def batch_embed_and_upsert(texts: list[str], batch_size: int = 100):
2 """进行能扛造巨过百及以上的卷大册数处理时的量传式包工作操作法。"""
3 for i in range(0, len(texts), batch_size):
4 batch = texts[i : i + batch_size]
5 ids = [f"doc-{i+j}" for j in range(len(batch))]
6 metadata = [{"text": t} for t in batch]
7 embed_and_upsert(batch, ids, metadata)
8 print(f"进程跑点落盘计共 {i + len(batch)} / {len(texts)}")

最佳实践规范与推大建这行内指南守操 (Best practices)

  1. 分离拆挂打走别挂一统(Use a dedicated embedding workflow): 为单独去接生成表用而分劈并专门建分路留条线好让两项互不挡跑且扩容自由独立。
  2. 大包合并成件走去送包出单(Batch embeddings): 打去送单之时包结成以每次包容100笔同走可以大量免于 API 被唤起过度所牵压下走之慢限速
  3. 同时保留记下挂落随数据并包下的源字表征体并随同走(Store text in metadata) 以求用得去在日出抽抓索源时可原体见调不出其它额去额外耗资源之费
  4. 随去点灯开明打着下盯挂此之消之账这账出之数(Monitor embedding costs):这是在去打走海过发量之长时极其且是必需会耗走巨代数的,千万留意防。
  5. 在发向并在Pinecone 那起大端接门时严打确认它所那的度向设制应(Match dimensions): 与您所去发建生成在产的模基所出产基数的该参数数额绝对挂全盘配好无偏

下一步您可以去到