核心问题 :当我们期望机器”理解”文本时,我们的期望到底是什么?
机器阅读理解的演进 传统 MRC (2015-2019) 基于 span extraction 的方法:
1 2 输入: Context + Question 输出: (start_idx, end_idx)
代表模型:BiDAF, R-Net, QANet, BERT
LLM 时代的 MRC (2020-至今) 从”抽取”到”生成”的范式转变:
1 2 输入: Context + Question + Instruction 输出: 自由形式的答案
任务分类与难度
类型
传统方法
LLM 方法
难度
抽取式
✅ 擅长
✅ 擅长
⭐
多跳推理
❌ 困难
⚠️ 有限
⭐⭐⭐
数值推理
❌ 几乎不能
⚠️ 需要 CoT
⭐⭐⭐⭐
常识推理
❌ 不能
✅ 较好
⭐⭐⭐
开放生成
❌ 不能
✅ 擅长
⭐⭐
现代方法:RAG 检索增强生成 (Retrieval-Augmented Generation) 结合了检索和生成的优势:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class RAGSystem : def __init__ (self, retriever, generator ): self .retriever = retriever self .generator = generator def answer (self, question: str ) -> str : docs = self .retriever.retrieve(question, top_k=5 ) context = "\n\n" .join([d.text for d in docs]) prompt = f"""基于以下文档回答问题: {context} 问题:{question} 答案:""" return self .generator.generate(prompt)
检索器选择
检索器
特点
适用场景
BM25
关键词匹配,快速
短查询,精确匹配
Dense Retriever
语义匹配
语义相似查询
ColBERT
延迟交互
平衡效率与效果
Hybrid
结合稀疏+稠密
生产环境
Chain-of-Thought 推理 对于需要推理的问题,CoT prompting 显著提升效果:
1 2 3 4 5 6 7 8 9 10 prompt_standard = "Q: 小明有5个苹果,给了小红2个,还剩几个?\nA:" prompt_cot = """Q: 小明有5个苹果,给了小红2个,还剩几个? A: 让我们一步步思考: 1. 小明最初有 5 个苹果 2. 他给了小红 2 个苹果 3. 剩余苹果数 = 5 - 2 = 3 答案是 3 个苹果。"""
评估指标 传统指标
𝟙
LLM 时代的指标 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def llm_evaluate (question, gold_answer, pred_answer ): prompt = f"""评估预测答案的质量(1-5分): 问题:{question} 标准答案:{gold_answer} 预测答案:{pred_answer} 评分标准: 5分 - 完全正确且信息完整 4分 - 基本正确,略有遗漏 3分 - 部分正确 2分 - 有相关信息但不正确 1分 - 完全错误 分数:""" return llm.generate(prompt)
实践建议 何时用传统 MRC
答案明确在文档中
需要精确的位置标注
低延迟要求
资源受限
何时用 RAG + LLM
需要整合多个文档
答案需要推理或总结
开放域问答
用户期望自然语言回答
代码示例:现代 RAG 系统 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 from langchain.vectorstores import FAISSfrom langchain.embeddings import OpenAIEmbeddingsfrom langchain.chat_models import ChatOpenAIfrom langchain.chains import RetrievalQAembeddings = OpenAIEmbeddings() vectorstore = FAISS.load_local("my_index" , embeddings) llm = ChatOpenAI(model="gpt-4" , temperature=0 ) qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff" , retriever=vectorstore.as_retriever(search_kwargs={"k" : 5 }), return_source_documents=True ) result = qa_chain({"query" : "什么是机器阅读理解?" }) print (result["result" ])
延伸阅读
转载请注明出处