RAG-QA-Generator icon indicating copy to clipboard operation
RAG-QA-Generator copied to clipboard

KeyError: 'chunk'

Open Maojianzeng opened this issue 9 months ago • 1 comments

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("请上传文件。")`

这个问题的原因,应该是博主并未上传完整代码吧。

Maojianzeng avatar Apr 07 '25 02:04 Maojianzeng

如果有错误,请查看一下文件格式,也可写个简单的txt文件测试一下

wangxb96 avatar Apr 07 '25 09:04 wangxb96