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

基于LlamaIndex的PDF知识库聊天Bot返回答案来源文件实现求助

实现LlamaIndex聊天Bot返回答案时附带PDF来源文件

现有基于LlamaIndex开发的聊天Bot可基于指定目录下的PDF文件构建知识库并提供问答,但当前仅返回答案内容。需要实现Bot在返回答案时同步告知用户对应的信息来源PDF文件,且必须使用LlamaIndex库完成,此前相关方案尝试无效。

修改后的完整代码

import openai
from llama_index import ServiceContext, GPTVectorStoreIndex, LLMPredictor, PromptHelper, SimpleDirectoryReader, load_index_from_storage, StorageContext
from langchain import OpenAI
import os
import re

drivepath = "C://Users//"

# 设置API密钥
os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY"
openai.api_key = "YOUR_OPENAI_API_KEY"

def construct_index(drivepath):
    # 设置最大输入长度
    max_input_size = 4096
    # 设置输出token数量
    num_outputs = 2000
    # 设置最大块重叠率
    max_chunk_overlap = 0.5
    # 设置块大小限制
    chunk_size_limit = 600
    # 定义提示助手
    prompt_helper = PromptHelper(max_input_size, num_outputs, max_chunk_overlap, chunk_size_limit=chunk_size_limit)
    # 定义大语言模型预测器
    llm_predictor = LLMPredictor(llm=OpenAI(temperature=0.05, model_name="text-davinci-003", max_tokens=num_outputs, top_p=0.1, frequency_penalty=0.8, verbose=None))

    documents = SimpleDirectoryReader(drivepath, recursive=True).load_data()
    service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, prompt_helper=prompt_helper)

    index = GPTVectorStoreIndex.from_documents(documents, service_context=service_context)
    index.storage_context.persist(persist_dir="index")
    return index

def get_response(user_input):
    storage_context = StorageContext.from_defaults(persist_dir="index")
    index = load_index_from_storage(storage_context)
    query_engine = index.as_query_engine()
    streaming_response = query_engine.query(user_input)
    
    # 提取来源PDF文件
    source_files = set()
    for source in streaming_response.sources:
        # 从元数据中获取文件名
        if hasattr(source.node, 'metadata') and 'file_name' in source.node.metadata:
            source_files.add(source.node.metadata['file_name'])
    
    # 拼接答案和来源信息
    answer = streaming_response.response
    if source_files:
        answer += "\n\n**信息来源PDF文件:**\n" + "\n- ".join(source_files)
    
    return answer

# 首次运行时取消注释以构建索引
# construct_index('C://Users')

while True:
    user_input = input("Enter your query: ")
    response = get_response(user_input)
    print('ANSWER:', response)

关键修改说明

  • 修正了原代码中service_context的缩进错误,确保代码可正常运行
  • 在get_response函数中,通过streaming_response.sources获取查询结果对应的来源节点
  • 从每个来源节点的metadata中提取file_name字段,使用集合去重避免重复显示同一文件
  • 将来源信息格式化后拼接在答案末尾,清晰告知用户信息来源

内容的提问来源于stack exchange,提问作者M. Ali Siddique

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:50:40