news 2026/10/5 4:56:55

第三单元 —— 第六课:带来源的完整 RAG 问答

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第三单元 —— 第六课:带来源的完整 RAG 问答

上一课找到了相关片段;这次把片段交给 DeepSeek,让它回答并标注依据。继续使用同一文件夹里的bookstore.txt。

保存为unit3_lesson6_rag_with_sources.py:

import os from pathlib import Path from langchain_core.documents import Document from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_core.vectorstores import InMemoryVectorStore from langchain_huggingface import HuggingFaceEmbeddings from langchain_openai import ChatOpenAI from langchain_text_splitters import RecursiveCharacterTextSplitter # 1. 读取、切分文档 file_path = Path(__file__).with_name("bookstore.txt") document = Document( page_content=file_path.read_text(encoding="utf-8"), metadata={"source": file_path.name}, ) splitter = RecursiveCharacterTextSplitter( chunk_size=120, chunk_overlap=20, add_start_index=True, separators=["\n\n", "\n", "。", ",", ""], ) chunks = splitter.split_documents([document]) # 2. 建立向量库并检索 embeddings = HuggingFaceEmbeddings( model_name="BAAI/bge-small-zh-v1.5", model_kwargs={"device": "cpu", "local_files_only": True}, encode_kwargs={"normalize_embeddings": True}, ) vector_store = InMemoryVectorStore.from_documents(chunks, embeddings) retriever = vector_store.as_retriever(search_kwargs={"k": 2}) question = "买书后可以退货吗?" found = retriever.invoke(question) context = "\n\n".join( f"[{number}] {doc.page_content}" for number, doc in enumerate(found, start=1) ) # 3. 根据检索到的片段回答 model = ChatOpenAI( model="deepseek-v4-flash", base_url="https://api.deepseek.com", api_key=os.environ["DEEPSEEK_API_KEY"], ) prompt = ChatPromptTemplate.from_messages([ ( "system", "只根据提供的资料回答。每个结论后标注资料编号,如 [1]。" "资料没有说明的事情,回答“资料中没有相关信息”。" ), ("human", "资料:\n{context}\n\n问题:{question}"), ]) chain = prompt | model | StrOutputParser() answer = chain.invoke({"context": context, "question": question}) print("回答:", answer) print("\n检索到的原文片段:") for number, doc in enumerate(found, start=1): print( f"[{number}] {doc.metadata['source']}," f"起始位置 {doc.metadata['start_index']}" ) print(doc.page_content)

在已激活虚拟环境、已设置 DeepSeek Key 的 CMD 中运行:

python unit3_lesson6_rag_with_sources.py

这次把“模型的回答”和“实际检索到的原文”一起打印出来。检查[1]、[2]是否真的支持回答,是验证 RAG 结果的重要一步。

小练习:把问题改成“书店提供送货吗?”。向量库仍会返回最相近的片段,但资料里没有送货规则;观察模型能否正确回答“资料中没有相关信息”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 4:56:48

牡蛎状态检测:基于YOLOv8的三分类数据集训练与优化

简介:面向水产养殖智能监测与海产加工自动化场景的牡蛎状态检测数据集,包含1,058张真实养殖环境图片,覆盖闭合、过渡、开放三种关键生理状态,适用于构建养殖健康度评估、自动分拣与生态行为研究模型。压缩包共2000个文件&#xff…

作者头像 李华
网站建设 2026/10/5 4:56:43

插件加载失败?拆解plugins底层原理与实战排查指南

最近连续在几个开发者社群里看到和 plugins 相关的报错刷屏:有人在问 IAR 里的 plugins 到底是干什么的,有人在问 MusicFree 的 plugins 为什么装完没效果,还有人贴出“failed to load plugins web boot: 2 entries did not activate linxin6…

作者头像 李华
网站建设 2026/10/5 4:56:38

CubeStudio:一键部署开源模型为OpenAI兼容API

1. 为什么非得把 HuggingFace 模型“套”进 OpenAI API 这个壳子?我第一次在客户现场看到这个需求时,心里直犯嘀咕:HuggingFace 本地跑得好好的,模型权重、Tokenizer、推理脚本全都有,干嘛非得绕一圈去模拟 OpenAI 的/…

作者头像 李华
网站建设 2026/10/5 4:56:22

深入解析PCIe三种数据包:TLP、DLLP与PLP的格式、作用及实战排查

同很多刚开始接触PCIe的同学一样,我最早看到事务层包、数据链路层包、物理层包这堆概念的时候,脑子里只有一个想法:不就是发个数据吗,搞这么复杂干什么。但等到真正去调FPGA的PCIe接口、去排查一次DMA传输失败、去分析协议分析仪抓…

作者头像 李华
网站建设 2026/10/5 4:56:22

图神经网络热点周报:动态图、表情识别与大模型融合全解析

这周的第39周图神经网络热点论文,我照例花了一个晚上加一个早上的时间,把公开预印本平台上新挂出来的图神经网络相关文章扫了一遍。图神经网络(GNN)这个方向上新论文的产出速度一直很快,但热点的分布其实很集中&#x…

作者头像 李华
网站建设 2026/10/5 4:56:06

AI Agent实战指南:从框架选型到并发架构与工程落地

1. 别急着写代码,先把"Agent是什么"想清楚最近不管是技术群还是朋友圈,几乎全在聊AI Agent。但说实话,我见过太多人把Agent当成一个高级聊天机器人来用,花了两周时间搭了个壳,最后发现生产环境根本跑不起来。…

作者头像 李华