基于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
相关产品推荐
相关产品推荐

