news 2026/9/28 4:51:50

秋招agent八股文(3)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
秋招agent八股文(3)

用最通俗易懂的方式来理解RAG,那就是从数据库查资料,把查到的资料拿出来,然后写进Prompt里面,最后交给LLM。

一、RAG到底在做什么

RAG是Retrieval-Augmented Generation,通常译为“检索增强生成”。我的理解是:先从外部资料中检索与问题相关的内容,再把这些内容连同问题交给生成模型。外部资料是回答是提供的上下文,不需要把这几条重新训练进模型参数。

二、实现最简RAG项目:环境准备

##powershell## mkdir rag_practice cd rag_practice notepad rag.py

创建文件夹并且进入,然后创建一个Python的记事本脚本,只要你本地电脑中已经有Python就足够了,不需要再设置虚拟环境,因为接下来这段代码不需要安装其他Python的包,只需要Python自带的内容就可以完成了。

三、项目代码

第一步:建库

人工构造 3 条文档片段,手动标注 id、关键词元数据,直接生成可用的文档列表。

documents = [ { "id": "D1", "keywords": ["RAG", "检索增强生成"], "text": "RAG 先检索相关资料,再让模型根据资料回答问题。", }, { "id": "D2", "keywords": ["切分", "分块"], "text": "文本切分是把长文档拆成小段,方便找到相关内容。", }, { "id": "D3", "keywords": ["Agent", "智能体"], "text": "Agent 可以根据任务决定调用哪个工具。", }, ] print(f"已准备 {len(documents)} 条资料")

这是极简内容,在完整项目中这段内容模拟建库,建立企业级数据库需要下列流程:

1、文档加载(统一输出结构):文本可能来自不同类型的文件

2、文本清洗和结构化解析(去除水印、空行、乱码、统一编码等):真实文件存在大量噪声

3、文本切分(解决检索匹配问题):块太大→检索匹配不准;块太小→上下文语义断裂

4、元数据增强(记录重要数据):检索时可做元数据过滤(比如只搜某份文件、某类主题),回答时可溯源到具体页码

建库时候Embedding模型

建库时: D1 的 text → Embedding 模型 → 向量 v1 D2 的 text → Embedding 模型 → 向量 v2 D3 的 text → Embedding 模型 → 向量 v3 提问时: “怎样让模型先查资料再回答?” → Embedding 模型 → 问题向量 q → 比较 q 与 v1、v2、v3 的相似度 → 取回最相关资料的原文

第二步:接受用户问题

这段代码接收用户输入的问题,去除空格,并将内容转变为小写。

question = input("请输入问题:").strip() normalized_question = question.lower()

在真实项目中,用户内容可能来自网页聊天框或者接口请求,可能还需要将问题处理为向量。

第三步:检索相关内容

这里实现的是手工标签的词面匹配,没有计算相关性分数。

retrieved_docs = [] for document in documents: for keyword in document["keywords"]: if keyword.lower() in normalized_question: retrieved_docs.append(document) break

在真实项目中用 Embedding 模型把每个片段转换成向量,并让向量与原文、来源保持关联。

所以Embedding模型的职责是帮助找经过处理向量数据库中的关联向量。

第四步:查看检索结果,处理空结果

打印命中了哪些资料,便于检查检索是否符合预期。若一条也没找到,就结束程序,避免把空资料交给模型。

print(f"检索到 {len(retrieved_docs)} 条资料") for document in retrieved_docs: print(f"[{document['id']}] {document['text']}") if not retrieved_docs: print("没有检索到相关资料,暂不生成回答。") raise SystemExit

第五步:把资料整理成上下文

把每条命中资料的编号和原文放在一起,再用换行符连接。最终的context就是准备提供给模型的参考资料。

context_lines = [] for document in retrieved_docs: context_lines.append(f"[{document['id']}] {document['text']}") context = "\n".join(context_lines)

系统可能取回多个片段,连同文件名、页码等来源一起整理。同时需要控制资料长度、减少重复内容,避免把大量无关片段放进模型输入。

第六步:构造Prompt

把回答要求、检索资料和用户问题放在同一个 Prompt 中。原本模型只看到问题;现在还能看到我们检索出的资料。

prompt = f"""请只根据下面的资料回答问题。 如果资料不足,请回答“资料不足,无法回答”。 回答后标出所用资料编号,例如 [D1]。 资料: {context} 问题:{question} 回答:"""

所以我们总结一下,用最通俗易懂的方式来理解RAG,那就是从数据库查资料,把查到的资料拿出来,然后写进Prompt里面,最后交给LLM。

写进Prompt、写进Prompt、写进Prompt(重要的东西说三遍)

最重要的地方就是把内容写进Prompt也可以说是写进提示词工程中。

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

Keil MDK 5.37恢复ARMCC V5攻略:解决老工程编译报错与AC5/AC6切换问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 4:49:09

高温适配器本质是热-电-力-化四场耦合的微尺度工程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 4:47:07

编程世界的未来:程序员的职业发展前景

在这个数字化时代, 程序员扮演着非常重要的角色, 他们不光在创造应用程序、网站还有软件,他们还在推动着技术的前沿方向, 并且也在解决复杂问题, 关于程序员的职业前景, 这是让人觉得兴奋的, 是充满了各种机会和潜力的。1. 计算机编程一直以来都属于需求非常高的领域…

作者头像 李华
网站建设 2026/9/28 4:47:03

使用python,写一个自动浏览文章的脚本

它是一种可以让网页实现自动点击的工具软件, 这款工具能够同时监控页面里的内容有没有发生变化, 如果有变化的话, 它会给出来报警和提示, 这种软件主要用来搞广告点击或者是为了提高一个网页的点击率, 它能支持链接进行点击操作, 也能支持Js广告的点击操作, 还能支持Ifrem的点击…

作者头像 李华
网站建设 2026/9/28 4:46:48

Python怎么运行程序?一分钟读懂

它<, 一种被广泛使用的高级编程语言>以其易于学习和灵活性而闻名。<, 在数据科学、网络开发、自动化以及科学计算等各个不同的领域之中它都扮演着关键的重要角色。>但是, 对于许多人来讲, 在开始深入探索关于编程的世界之前, 充分了解如何正确运行程序显得尤为至关…

作者头像 李华
网站建设 2026/9/28 4:45:31

初级1_python概述

目录 应用领域 语言优势 语言缺点 下载和安装 应用领域 语言优势 解释型语言&#xff1a;一边解释&#xff08;或翻译&#xff09;一边运行。胶水语言&#xff1a;因为 Python 能通过丰富的接口和模块&#xff0c;把 C/C、Java 等不同语言写成的组件方便地“粘”在一起协同…

作者头像 李华