资讯动态

在 generative-ai-for-beginners 中构建基于 RAG 与向量数据库的知识库问答应用

发布时间:2026/9/10 9:45:02 来源:尧图企业网站定制
在 generative-ai-for-beginners 中构建基于 RAG 与向量数据库的知识库问答应用【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners本文基于 translations/hi/15-rag-and-vector-databases/README.md 课程第 15 课整理讲解如何在大型语言模型LLM应用中落地检索增强生成RAG与向量数据库从文本分块、嵌入、向量检索到端到端聊天机器人并给出可运行的 Python 代码与底层原理。读完本文你将能够独立构建一个将私有文档接地到 LLM 的问答应用并掌握检索质量评估方法。RAG 是什么为什么要把数据接地到 LLMLLM 驱动的聊天机器人通过处理用户提示词来生成回复其能力上限受限于上下文与预训练数据。例如 GPT-4 的知识截止于 2021 年 9 月此后发生的事件它无从知晓同时用于训练 LLM 的数据通常不包含个人笔记、公司产品手册这类私密信息。因此仅靠预训练权重无法回答私有领域问题。检索增强生成Retrieval Augmented GenerationRAG正是为此而生在生成前先从你的知识库中检索相关内容把检索结果作为额外上下文注入提示词再交给 LLM 生成回答。这样生成的回复既基于预训练能力又基于你提供的真实数据。RAG 的工作流程RAG 的核心流程包含四个环节知识库Knowledge base检索发生前文档需要被摄取并预处理——通常将大文档切分成小块chunk、转换为文本嵌入text embedding并存入数据库用户提问User query用户提出一个问题检索Retrieval当用户提问时嵌入模型从知识库中检索相关信息为提示词补充上下文增强生成Augmented generationLLM 基于检索到的数据增强其回复使回复不只依赖预训练数据还融合新增上下文的关联信息最后把答案返回给用户。RAG 的架构与两种实现范式RAG 的架构基于 Transformer包含编码器encoder与解码器decoder两部分用户提问时输入文本被编码为捕获词义的向量这些向量在文档索引中被解码并基于用户查询生成新文本。根据原论文提出的两种实现方式RAG-Sequence使用检索到的文档预测用户查询的最佳答案整段生成基于检索结果RAG-Token使用文档生成下一个 token再检索以继续回答用户查询逐 token 结合检索。为什么使用 RAG信息丰富性保证文本回复是及时、最新的通过访问内部知识库提升领域特定任务的表现减少幻觉fabrication利用知识库中可验证的数据为用户查询提供上下文降低编造风险成本效益高相比对 LLM 做微调fine-tuningRAG 更经济。场景设定把课程笔记变成可问答的知识库本课场景是教育类初创应用把自有学习笔记加入聊天机器人让它在不同学科上提供更多信息。实现方案由三部分组成Azure OpenAI用于构建聊天机器人的 LLMAI for Beginners 的神经网络课程作为接地LLM 的数据对应仓库中的 15-rag-and-vector-databases/data/perceptron.md、15-rag-and-vector-databases/data/frameworks.md、15-rag-and-vector-databases/data/own_framework.mdAzure AI Search 与 Azure Cosmos DB用于存储数据并建立搜索索引的向量数据库。用户将能基于笔记生成练习测验、复习闪卡并把内容概括成简明要点。完整可执行示例见 15-rag-and-vector-databases/notebook-rag-vector-databases.ipynb。构建知识库向量数据库与传统数据库不同向量数据库是专门用于存储、管理和检索嵌入向量的数据库保存的是文档的数值化表示。把数据拆解为数值嵌入能让 AI 系统更容易理解与处理数据。之所以把嵌入存进向量数据库是因为 LLM 对输入 token 数量有上限——你无法把全部嵌入一次性交给 LLM需要将其切块当用户提问时与问题最相似的嵌入会和提示词一起返回。分块同时降低了 LLM 处理 token 数量带来的成本。常见向量数据库包括 Azure Cosmos DB、Clarifyai、Pinecone、Chromadb、ScaNN、Qdrant 与 DeepLake 等。可用 Azure CLI 创建 Azure Cosmos DB 实例az login az group create -n resource-group-name -l location az cosmosdb create -n cosmos-db-name -r resource-group-name az cosmosdb list-keys -n cosmos-db-name -g resource-group-name创建完成后在 Azure 门户的 Data Explorer 中新建数据库和容器。notebook 中随后用CosmosClient通过环境变量COSMOS_DB_ENDPOINT与COSMOS_DB_KEY建立连接数据库名rag-cosmos-db、容器名data见 notebook-rag-vector-databases.ipynb。从文本到嵌入存储前需先把数据转换为向量嵌入。处理大文档或长文本时可按预期问题将内容分块分块可以在句子级或段落级进行。由于块的语义来源于周围词汇可以给块补充上下文例如附加文档标题或在块前后包含一些文本。分块函数示例def split_text(text, max_length, min_length): words text.split() chunks [] current_chunk [] for word in words: current_chunk.append(word) if len( .join(current_chunk)) max_length and len( .join(current_chunk)) min_length: chunks.append( .join(current_chunk)) current_chunk [] # 若最后一个块未达最小长度仍将其加入 if current_chunk: chunks.append( .join(current_chunk)) return chunksnotebook 中通过splitted_df[chunks] splitted_df[text].apply(lambda x: split_text(x, 400, 300))应用分块max_length400、min_length300再用flattened_df splitted_df.explode(chunks)把每个块展开为独立行形成包含path、text、chunks列的数据帧。分块后可选用不同嵌入模型将文本向量化例如 word2vec、OpenAI 的 ada-002、Azure Computer Vision 等。模型选择取决于使用的语言、编码内容类型文本/图像/音频、可编码的输入大小以及嵌入输出长度。notebook 中封装了统一的嵌入函数调用client.embeddings.create模型取环境变量配置的AZURE_OPENAI_EMBEDDINGS_DEPLOYMENTdef create_embeddings(text, modelNone): # 使用嵌入部署为每个文档块创建嵌入 model model or embeddings_deployment embeddings client.embeddings.create(inputtext, modelmodel).data[0].embedding return embeddings随后遍历所有块生成嵌入并写回数据帧flattened_df[embeddings] embeddings。检索与向量搜索用户提问时检索器先用查询编码器把它转换为向量再在文档搜索索引中查找与输入相关的向量完成后把输入向量与文档向量都转回文本交给 LLM。检索的目标是快速找出满足搜索条件、可用于提供上下文并把 LLM 接地到你的数据上的文档。数据库内搜索方式有关键词搜索keyword search用于文本搜索向量搜索vector search用嵌入模型把文档从文本转换为向量表示借助词义实现语义搜索——检索时查询那些向量表示与用户问题最接近的文档混合搜索hybrid关键词与向量搜索的组合。当数据库中没有与查询相似的答案时系统会返回可得的最佳信息为控制相关性可以设置最大距离阈值或采用关键词向量的混合搜索。本课采用混合搜索并把数据存入包含块与嵌入列的数据帧中。向量相似度度量检索器会在知识库中寻找彼此接近的嵌入最近邻因为它们代表相似的文本。用户查询首先被嵌入再与相似嵌入匹配。衡量向量相似度最常用的是余弦相似度基于两个向量夹角的余弦值替代方案包括欧几里得距离Euclidean distance向量端点之间的直线距离点积dot product两个向量对应元素乘积之和。构建搜索索引执行检索前需要先为知识库建立搜索索引。索引存储嵌入即使数据库很大也能快速取回最相似的块。本地可用 scikit-learn 构建from sklearn.neighbors import NearestNeighbors embeddings flattened_df[embeddings].to_list() # 创建搜索索引 nbrs NearestNeighbors(n_neighbors5, algorithmball_tree).fit(embeddings) # 查询索引时使用 kneighbors 方法 distances, indices nbrs.kneighbors(embeddings)notebook 会把返回的索引与距离写回数据帧flattened_df[indices]、flattened_df[distances]用于后续检索与重排。重排Re-ranking查询数据库后通常需要把结果按相关性从高到低排序。重排 LLM 利用机器学习提升搜索结果相关性并排序。使用 Azure AI Search 时语义重排器semantic reranker会自动完成重排。下面是基于最近邻的重排示例# 查找最相似的文档 distances, indices nbrs.kneighbors([query_vector]) index [] # 打印最相似的文档 for i in range(3): index indices[0][i] for index in indices[0]: print(flattened_df[chunks].iloc[index]) print(flattened_df[path].iloc[index]) print(flattened_df[distances].iloc[index]) else: print(fIndex {index} not found in DataFrame)实际运行中对问题 what is a perceptron?检索结果确实命中了 data/perceptron.md 中的感知机介绍块验证了整条检索链路。端到端把所有环节串起来最后一步是引入 LLM获得基于自己数据的回答。完整实现如下user_input what is a perceptron? def chatbot(user_input): # 把问题转换为查询向量 query_vector create_embeddings(user_input) # 查找最相似的文档 distances, indices nbrs.kneighbors([query_vector]) # 把文档加入查询以提供上下文 history [] for index in indices[0]: history.append(flattened_df[chunks].iloc[index]) # 合并历史与用户输入 history.append(user_input) # 创建消息对象 messages[ {role: system, content: You are an AI assistant that helps with AI questions.}, {role: user, content: \n\n.join(history) } ] # 使用 Responses API 生成回答 response client.responses.create( modelchat_deployment, temperature0.7, max_output_tokens800, inputmessages, storeFalse, ) return response.output_text chatbot(user_input)notebook 中客户端配置基于 Azure OpenAIMicrosoft Foundryv1 端点通过环境变量AZURE_OPENAI_ENDPOINT、AZURE_OPENAI_API_KEY、AZURE_OPENAI_EMBEDDINGS_DEPLOYMENT、AZURE_OPENAI_DEPLOYMENT注入chat_deployment即AZURE_OPENAI_DEPLOYMENT。代码路径见 notebook-rag-vector-databases.ipynb 的 Putting it all together to answer a question 小节。关于temperature与max_output_tokenstemperature0.7在 0~1 之间数值越高回复越随机、越低越确定max_output_tokens800限制生成的最大 token 数二者是生成阶段可调的核心参数。评估应用与检索质量评估指标回复质量Quality确保回复听起来自然、流畅、像人话数据接地性Groundedness评估回复是否来源于所提供的文档相关性Relevance评估回复是否与所问问题匹配、相关流畅性Fluency回复在语法上是否通顺合理。用 MAP 做量化评估notebook 的 Testing and evaluation 小节给出了一个基于**平均精度均值Mean Average PrecisionMAP**的量化评估示例为每个测试查询准备相关与不相关回复调用chatbot(query)生成回复用sklearn.metrics.average_precision_score计算单查询平均精度再对所有查询取平均得到mean_average_precision示例输出为0.5。这为检索质量可度量提供了可直接套用的模板。RAG 与向量数据库的应用场景问答Question and Answering把公司数据接地到聊天应用供员工提问推荐系统Recommendation Systems构建匹配最相似值的系统如电影、餐厅推荐等聊天机器人服务Chatbot services存储聊天历史基于用户数据个性化对话基于向量嵌入的图像搜索适用于图像识别与异常检测。总结与练习本文覆盖了 RAG 的三大基础环节把数据加入应用、用户查询、输出生成。为简化 RAG 构建可借助 Semantic Kernel、LangChain 或 Autogen 等框架更完整的可运行示例可参考 15-rag-and-vector-databases/notebook-rag-vector-databases.ipynb样本数据位于 15-rag-and-vector-databases/data。动手练习建议使用自己选择的框架为应用构建前端选用 LangChain 或 Semantic Kernel 之一重建你的 RAG 应用。【免费下载链接】generative-ai-for-beginners21 Lessons, Get Started Building with Generative AI项目地址: https://gitcode.com/GitHub_Trending/ge/generative-ai-for-beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价