RAG-QA-Generator
RAG-QA-Generator copied to clipboard
KeyError: 'chunk'
AutoQAG.py 解析上传文件后,生成的内容不包含chunk字段。研读源码发现,代码中并未设置生成chunk字段,却在前端展示时调用。 下面是提示词和解析内容生成模板定义,可以发现只定义了question和answer字段。
`def generate_qa_pairs_with_progress(text_chunks): """生成问答对并显示进度""" qa_pairs = [] progress_bar = st.progress(0) for i, chunk in enumerate(text_chunks): prompt = f"""基于以下给定的文本,生成一组高质量的问答对。请遵循以下指南:
1. 问题部分:
- 为同一个主题创建尽可能多的(如K个)不同表述的问题,确保问题的多样性。
- 每个问题应考虑用户可能的多种问法,例如:
- 直接询问(如“什么是...?”)
- 请求确认(如“是否可以说...?”)
- 寻求解释(如“请解释一下...的含义。”)
- 假设性问题(如“如果...会怎样?”)
- 例子请求(如“能否举个例子说明...?”)
- 问题应涵盖文本中的关键信息、主要概念和细节,确保不遗漏重要内容。
2. 答案部分:
- 提供一个全面、信息丰富的答案,涵盖问题的所有可能角度,确保逻辑连贯。
- 答案应直接基于给定文本,确保准确性和一致性。
- 包含相关的细节,如日期、名称、职位等具体信息,必要时提供背景信息以增强理解。
3. 格式:
- 使用 "Q:" 标记问题集合的开始,所有问题应在一个段落内,问题之间用空格分隔。
- 使用 "A:" 标记答案的开始,答案应清晰分段,便于阅读。
- 问答对之间用两个空行分隔,以提高可读性。
4. 内容要求:
- 确保问答对紧密围绕文本主题,避免偏离主题。
- 避免添加文本中未提及的信息,确保信息的真实性。
- 如果文本信息不足以回答某个方面,可以在答案中说明 "根据给定信息无法确定",并尽量提供相关的上下文。
5. 示例结构(仅供参考,实际内容应基于给定文本):
给定文本:
{chunk}
请基于这个文本生成问答对。
"""
response = get_completion(prompt)
if response:
try:
parts = response.split("A:", 1)
if len(parts) == 2:
question = parts[0].replace("Q:", "").strip()
answer = parts[1].strip()
qa_pairs.append({"question": question, "answer": answer})
else:
st.warning(f"无法解析响应: {response}")
except Exception as e:
st.warning(f"处理响应时出错: {str(e)}")
progress = (i + 1) / len(text_chunks)
progress_bar.progress(progress)
return qa_pairs`
在主函数中,处理并生成QA对时,需要显示chunk字段内容,此处就会报错。
`if operation == "上传文件": st.header("文件上传与QA对生成") # uploaded_file = st.file_uploader("上传非结构化文件", type=["txt", "pdf", "docx"]) uploaded_files = st.file_uploader("上传非结构化文件", type=["txt", "pdf", "docx"], accept_multiple_files=True) if uploaded_files: st.success("文件上传成功!")
if st.button("处理文件并生成QA对"):
with st.spinner("正在处理文件..."):
text_chunks = process_files(uploaded_files)
if not text_chunks:
st.error("文件处理失败,请检查文件格式是否正确。")
return
st.info(f"文件已分割成 {len(text_chunks)} 个文本段")
with st.spinner("正在生成QA对..."):
st.session_state.qa_pairs = generate_qa_pairs_with_progress(text_chunks)
st.success(f"已生成 {len(st.session_state.qa_pairs)} 个QA对")
if st.session_state.qa_pairs:
st.subheader("前3个QA对预览")
cols = st.columns(3)
for i, qa in enumerate(st.session_state.qa_pairs[:3]):
print(i)
print(qa)
print(qa.keys())
with st.expander(f"**QA对 {i + 1}**", expanded=True):
st.markdown("**问题:**")
st.markdown(qa['question'])
st.markdown("**答案:**")
st.markdown(qa['answer'])
st.markdown("**原文:**")
st.markdown(qa['chunk'])
st.markdown("---")
else:
st.warning("请上传文件。")`
这个问题的原因,应该是博主并未上传完整代码吧。
如果有错误,请查看一下文件格式,也可写个简单的txt文件测试一下