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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:13:26