如何用LlamaIndex获取大模型回答对应的PDF关联文档内容?
实现方案
核心思路
通过LlamaIndex的向量检索定位关联PDF节点(含文件名、页码、页面内容元数据),调用Azure OpenAI生成问题回答,最终将所有信息组装成指定格式的结果集。
具体实现步骤
- 环境配置:设置Azure OpenAI的API密钥、端点、模型部署名等环境变量,初始化LLM实例与LlamaIndex服务上下文。
- 元数据保障:加载PDF时确保每个文档节点携带
文件名和页码元数据(LlamaIndex的PDF加载器默认生成页码,文件名需从文件路径手动提取添加)。 - 检索引擎构建:基于已有的向量数据库构建检索器,设置合适的相似性检索数量(如
similarity_top_k=3)。 - 检索与回答生成:执行检索获取相关节点,提取元数据与页面内容,将这些内容作为上下文传入Azure OpenAI生成回答,同时标记状态(成功/无结果)。
- 结果组装:按要求格式整合回答、来源信息与状态。
代码示例
from llama_index import VectorStoreIndex, ServiceContext from llama_index.llms import AzureOpenAI import os # 配置Azure OpenAI参数 os.environ["AZURE_OPENAI_API_KEY"] = "你的API密钥" os.environ["AZURE_OPENAI_ENDPOINT"] = "你的端点URL" os.environ["AZURE_OPENAI_API_VERSION"] = "2023-07-01-preview" os.environ["AZURE_OPENAI_CHAT_DEPLOYMENT_NAME"] = "你的模型部署名" # 初始化LLM与服务上下文 llm = AzureOpenAI( deployment_name=os.environ["AZURE_OPENAI_CHAT_DEPLOYMENT_NAME"], model="gpt-35-turbo", temperature=0.1 ) service_context = ServiceContext.from_defaults(llm=llm) # 加载已保存的向量索引(假设已提前构建并保存) index = VectorStoreIndex.load_from_disk("vector_index.json", service_context=service_context) retriever = index.as_retriever(similarity_top_k=3) def get_answer_with_source(query): # 执行检索 retrieved_nodes = retriever.retrieve(query) # 处理无检索结果的情况 if not retrieved_nodes: return { "回答": "未找到匹配的相关内容", "PDF文件名": None, "页码": None, "页面内容": None, "状态": "检索无结果" } # 提取最相关来源的信息(可扩展为返回多个来源) top_node = retrieved_nodes[0] source_info = { "PDF文件名": top_node.metadata.get("file_name", "未知文件"), "页码": top_node.metadata.get("page_label", "未知页码"), "页面内容": top_node.text.strip() } # 生成回答上下文 context = f"参考来源:{source_info['PDF文件名']} 第{source_info['页码']}页\n内容:{source_info['页面内容']}" prompt = f"根据以下参考内容回答问题:{query}\n\n{context}" # 调用Azure OpenAI生成回答 response = llm.complete(prompt) # 组装最终结果 return { "回答": str(response), "PDF文件名": source_info["PDF文件名"], "页码": source_info["页码"], "页面内容": source_info["页面内容"], "状态": "成功" } # 示例调用 result = get_answer_with_source("请说明文档中的数据加密方案") print(result)
结果格式示例
{ "回答": "文档中提到的数据加密方案采用AES-256对称加密算法,密钥由系统自动生成并存储在加密密钥管理服务中...", "PDF文件名": "security_spec.pdf", "页码": "12", "页面内容": "数据加密机制:采用AES-256对称加密算法,所有传输数据与存储数据均经过加密处理。密钥由KMS服务统一管理,定期自动轮换...", "状态": "成功" }
注意事项
- 若需返回多个相关来源,可将结果中的PDF文件名、页码、页面内容改为列表形式,同时在生成回答时整合多个来源的上下文。
- 可调整
similarity_top_k参数控制检索节点数量,平衡回答准确性与冗余度。 - 确保向量数据库中的节点元数据正确包含
file_name和page_label,否则需在加载PDF时补充该信息。
内容的提问来源于stack exchange,提问作者JohnB
相关产品推荐
相关产品推荐

