如何基于Pinecone向量数据库实现特定车型主题的聊天机器人精准问答?
如何让聊天机器人针对特定车型从Pinecone返回精准结果?
要实现针对特定车型的精准查询,核心是给文档添加车型标识、过滤无关数据、优化检索逻辑,以下是具体可行的方案:
1. 给文档添加车型元数据并过滤检索
当前代码没有区分不同车型的文档,导致检索时会混入其他车型的内容。解决方法是在加载文档时给每个文档打上车型标签,查询时只检索对应标签的文档。
修改文档加载代码:
假设每个PDF文件对应一个车型(文件名包含车型名,比如Model3_specs.pdf),加载时从文件名提取车型并写入元数据:
from llama_index.core import VectorStoreIndex,SimpleDirectoryReader, StorageContext from llama_index.vector_stores.pinecone import PineconeVectorStore documents = SimpleDirectoryReader("directory_name").load_data() # 给每个文档添加车型元数据 for doc in documents: filename = doc.metadata["file_name"] # 根据实际文件名规则提取车型,这里示例用下划线分割取第一个部分 car_model = filename.split("_")[0] doc.metadata["car_model"] = car_model # 后续存储到Pinecone的代码不变 vector_store = PineconeVectorStore(pinecone_index=pinecone_index) storage_context = StorageContext.from_defaults(vector_store=vector_store) index = VectorStoreIndex.from_documents(documents=documents, storage_context=storage_context)
查询时添加车型过滤:
检索前指定车型过滤条件,只返回对应车型的文档片段:
from llama_index.core.retrievers import VectorIndexRetriever from llama_index.core.query_engine import RetrieverQueryEngine from llama_index.core.indices.postprocessor import SimilarityPostprocessor from llama_index.core.vector_stores import MetadataFilters # 动态指定要查询的车型,可从用户提问中提取 target_model = "Model3" # 构建元数据过滤器 filters = MetadataFilters( filters=[ { "key": "car_model", "value": target_model, "operator": "==" } ] ) retriever = VectorIndexRetriever( index=index, similarity_top_k=4, filters=filters # 应用车型过滤 ) postprocessor = SimilarityPostprocessor(similarity_cutoff=0.80) query_engine = RetrieverQueryEngine( retriever=retriever, node_postprocessors=[postprocessor] ) # 测试查询 response = query_engine.query("Model3的续航里程是多少?") print(response)
2. 优化检索参数与嵌入模型
- 调优相似度阈值:如果
similarity_cutoff=0.80导致结果太少,可适当降低到0.75-0.7;如果结果太杂,可提高到0.85。 - 缩小返回数量:把
similarity_top_k从4调整为2-3,减少无关内容干扰。 - 使用更精准的嵌入模型:默认模型可能不够适配汽车领域,可换成OpenAI的
text-embedding-3-large或针对汽车领域微调的嵌入模型,在创建索引时指定:
from llama_index.embeddings.openai import OpenAIEmbedding # 使用大尺寸嵌入模型 embed_model = OpenAIEmbedding(model="text-embedding-3-large") index = VectorStoreIndex.from_documents( documents=documents, storage_context=storage_context, embed_model=embed_model )
3. 自动提取用户查询中的车型并增强查询
通过LLM自动识别用户提问中的车型关键词,改写查询语句,提升检索精准度:
from llama_index.core.prompts import PromptTemplate from llama_index.core.query_engine import TransformQueryEngine from llama_index.core.transformations import QueryTransformation from llama_index.llms.openai import OpenAI llm = OpenAI(model="gpt-3.5-turbo") # 定义查询改写模板 rewrite_prompt = PromptTemplate( "任务:1. 从用户查询中提取车型名称;2. 将查询改写为针对该车型的精准技术问题,保留核心诉求。\n用户查询:{query_str}\n改写后的查询:" ) def rewrite_query(query_str): # 调用LLM改写查询 response = llm.complete(rewrite_prompt.format(query_str=query_str)) return response.text # 创建查询转换引擎 query_transform = QueryTransformation(rewrite_query) enhanced_query_engine = TransformQueryEngine(query_engine, query_transform) # 测试:用户模糊提问也能精准检索 response = enhanced_query_engine.query("这款特斯拉的电池容量有多大?") print(response)
4. 分车型独立存储索引
如果车型数量较多,可给每个车型单独创建Pinecone索引,查询时直接切换到对应索引,彻底避免跨车型干扰:
# 假设要创建Model3的专属索引 model3_index = pinecone.Index("model3-specs-index") vector_store = PineconeVectorStore(pinecone_index=model3_index) storage_context = StorageContext.from_defaults(vector_store=vector_store) # 仅加载Model3的文档 model3_docs = [doc for doc in documents if doc.metadata["car_model"] == "Model3"] index = VectorStoreIndex.from_documents(documents=model3_docs, storage_context=storage_context)
内容的提问来源于stack exchange,提问作者ASWIN M
相关产品推荐
相关产品推荐

