如何从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
相关产品推荐
相关产品推荐

