尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

大模型应用开发教程07 | RAG 核心概念(检索增强生成)

大模型应用开发教程07 | RAG 核心概念(检索增强生成) 理论部分在前面的内容里我们已经能把大模型“调用起来”也能通过 Prompt 让输出更可控、更结构化。但很快会遇到一个现实问题模型并不可靠地掌握我们业务里的最新知识并且在不确定时可能会“编一个看起来合理的答案”幻觉。RAGRetrieval-Augmented Generation检索增强生成就是为了解决这个问题而出现的一种应用模式。它的核心思想很简单先从我们自己的资料里检索出相关内容再把这些内容作为上下文喂给模型生成答案。把 RAG 拆开来看它通常由三段组成Index建库把文档切分chunk后向量化embedding并存储到向量索引/向量数据库里Retrieve检索用户提问后把问题向量化在向量库里找最相似的 Top-K 文档片段Generate生成把检索到的片段 用户问题一起交给模型让模型基于“证据”回答其中有两个关键概念Embedding向量表示把文本映射到高维向量空间使得“语义相近的文本向量更接近”相似度检索Vector Search用余弦相似度等指标衡量向量的接近程度从而找到与问题最相关的文档片段这一篇我们先把 RAG 的“检索”这一步用最小实现跑通不引入向量数据库只用一个微型知识库 embedding 余弦相似度直观看到“语义检索到底在做什么”。下一篇再把它升级为完整 RAG 应用向量库 检索增强生成。实践部分本案例做什么实现一个“极简向量检索”演示程序准备一个微型知识库4 条文本为每条文本生成 embedding 向量并缓存到内存输入查询问题把问题向量化计算查询向量与每条文档向量的余弦相似度找出相似度最高的那条文档作为检索结果并打印所有得分主要代码本篇使用项目脚本src/3.1_rag_embedding.pyimportosimportnumpyasnpfromdotenvimportload_dotenvfromopenaiimportOpenAI load_dotenv()clientOpenAI(api_keyos.getenv(ZHIPUAI_API_KEY),base_urlos.getenv(ZHIPUAI_BASE_URL))defget_embedding(text): 调用 Embedding API 将文本转换为向量 # 智谱的 embedding 模型名称通常为 embedding-2 或 embedding-3# 这里我们使用 embedding-2responseclient.embeddings.create(modelembedding-2,inputtext)returnresponse.data[0].embeddingdefcosine_similarity(v1,v2): 计算两个向量的余弦相似度 returnnp.dot(v1,v2)/(np.linalg.norm(v1)*np.linalg.norm(v2))defmain():print( 极简向量检索演示 )# 1. 模拟一个微型知识库documents[Python 是一种广泛使用的高级编程语言。,# ID: 0大熊猫是中国特有的珍稀动物主要以此竹子为食。,# ID: 1深度学习是机器学习的一个子集基于人工神经网络。,# ID: 2今天天气真不错适合出去玩。,# ID: 3]print(正在为知识库生成向量 (Embedding)...)# 实际项目中这步通常是预先做完存数据库的doc_vectors[]fordocindocuments:vecget_embedding(doc)doc_vectors.append(vec)print(f✅ 已处理:{doc[:10]}...)whileTrue:queryinput(\n请输入查询问题 (q退出): )ifqueryq:break# 2. 将用户问题向量化query_vecget_embedding(query)# 3. 计算相似度similarities[]fordoc_vecindoc_vectors:simcosine_similarity(query_vec,doc_vec)similarities.append(sim)# 4. 找出最相似的文档# np.argmax 返回最大值的索引best_idxnp.argmax(similarities)best_scoresimilarities[best_idx]print(f\n 检索结果 (相似度:{best_score:.4f}):)print(f文档内容:{documents[best_idx]})# 额外展示一下所有文档的得分方便理解print(\n--- 所有文档得分 ---)fori,scoreinenumerate(similarities):print(f文档{i}:{score:.4f}-{documents[i][:15]}...)if__name____main__:main()运行方式在项目根目录执行python3 src/3.1_rag_embedding.py运行结果示例我们可以输入一些“语义相关”的问题来观察检索效果例如“熊猫吃什么”“什么是深度学习”“Python 是干什么的”运行时会看到类似输出相似度分数每次可能略有波动 极简向量检索演示 正在为知识库生成向量 (Embedding)... ✅ 已处理: Python 是一种... ✅ 已处理: 大熊猫是中... ✅ 已处理: 深度学习是... ✅ 已处理: 今天天气真... 请输入查询问题 (q退出): 熊猫吃什么 检索结果 (相似度: 0.78xx): 文档内容: 大熊猫是中国特有的珍稀动物主要以此竹子为食。 --- 所有文档得分 --- 文档 0: 0.12xx - Python 是一种广泛... 文档 1: 0.78xx - 大熊猫是中国特有... 文档 2: 0.10xx - 深度学习是机器学... 文档 3: 0.05xx - 今天天气真不错...总结这一篇我们把 RAG 的核心流程讲清楚并用一个极简程序跑通了“向量化 相似度检索”的关键链路。通过这个实验我们能直观看到语义检索不是关键字匹配而是通过 embedding 向量在语义空间里寻找相近内容。
返回列表