You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Pinecone存储的多向量中获取带上下文的组合匹配结果?

问题与解决方案

问题概述

已使用OpenAI的text-embedding-ada-002模型将自定义Excel数据生成向量嵌入并存储到Pinecone,但查询时无法得到符合上下文的结果。现需通过gpt-3.5-turbo-instruct优化查询逻辑,同时从多个匹配向量中组合上下文生成准确答案。

现有代码问题分析

  • find_match函数仅返回1个匹配结果,无法获取多段上下文信息,导致答案缺乏完整性
  • 查询参数k=1和top_k=1限制了返回结果数量,无法覆盖相关度较高的多个向量
  • 缺少将多个匹配结果整合后,结合大语言模型生成连贯答案的逻辑
  • 向量入库时采用逐个upsert的方式,效率较低

优化方案与修改代码

1. 调整查询逻辑,获取多个匹配向量

修改查询函数,增加返回结果数量,收集所有匹配的上下文文本。

2. 新增结果整合与答案生成函数

利用gpt-3.5-turbo-instruct,将多段匹配上下文与用户查询结合,生成符合语境的答案。

3. 优化向量入库的批量操作

将逐个upsert改为批量提交,提升数据入库效率。

修改后的完整代码:

import uuid
import openai
import pinecone

EMBEDDING_MODEL = "text-embedding-ada-002"
PINECONE_API_KEY = "你的Pinecone密钥"

def create_embedding(text_to_embed):
    # 生成文本嵌入向量
    response = openai.embeddings.create(
        model=EMBEDDING_MODEL,
        input=text_to_embed
    )
    embedding = response.data[0].embedding
    return embedding

# 初始化Pinecone
pinecone.init(
    api_key=PINECONE_API_KEY, 
    environment='gcp-starter'
)
index_name = "chatbot"

# 创建索引(如果不存在)
if index_name not in pinecone.list_indexes():
    pinecone.create_index(name=index_name, metric="cosine", dimension=1536)
index = pinecone.Index(index_name)

# 批量导入向量(优化后)
stats = index.describe_index_stats()
if stats['total_vector_count'] < 1:
    embeddings_batch = []
    for chunk in splitted_docs:
        id = uuid.uuid4().hex
        embedding = create_embedding(chunk.page_content)
        embeddings_batch.append((id, embedding, {"text": chunk.page_content}))
    # 批量upsert,每100条提交一次(可根据需求调整)
    for i in range(0, len(embeddings_batch), 100):
        index.upsert(vectors=embeddings_batch[i:i+100])

def query_refiner(conversation, query):
    # 优化查询语句,使其更适配知识库检索
    response = openai.completions.create(
        model="gpt-3.5-turbo-instruct",
        prompt=f"给定以下用户对话记录和当前查询,生成一个最适合从知识库中获取答案的问题。\n\n对话记录:\n{conversation}\n\n当前查询:{query}\n\n优化后的查询:",
        temperature=0.7,
        max_tokens=256,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0
    )
    return response.choices[0].text.strip()

def find_matches(input, num_results=5):           
    # 获取多个匹配的上下文
    query_embedding = create_embedding(input) 
    results = index.query(query_embedding, k=num_results, include_metadata=True)
    return [match['metadata']['text'] for match in results["matches"]]

def generate_answer(conversation, query):
    # 整合上下文并生成答案
    refined_query = query_refiner(conversation, query)
    context_texts = find_matches(refined_query)
    # 将多个上下文拼接
    combined_context = "\n\n".join(context_texts)
    
    prompt = f"使用以下提供的上下文信息,回答用户的问题。如果上下文没有相关内容,请说明无法回答。\n\n上下文:\n{combined_context}\n\n用户问题:{query}\n\n答案:"
    
    response = openai.completions.create(
        model="gpt-3.5-turbo-instruct",
        prompt=prompt,
        temperature=0.7,
        max_tokens=512,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0
    )
    return response.choices[0].text.strip()

# 使用示例
# conversation = "用户之前的对话内容..."
# query = "用户当前的问题..."
# answer = generate_answer(conversation, query)
# print(answer)

关键优化点说明

  • 多向量匹配:将查询返回数量调整为5(可根据数据情况调整),确保获取足够的上下文信息
  • 结果整合:新增generate_answer函数,将多段上下文拼接后提交给大模型,生成连贯答案
  • 批量入库:采用批量upsert提升数据导入效率,避免频繁API调用
  • 查询优化:保留query_refiner函数,结合对话历史优化查询语句,提升检索准确性

内容的提问来源于stack exchange,提问作者Sameera Sadaqat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:53:13