RAG技术实战:让大模型拥有实时查阅外部知识库的能力,解决AI幻觉与知识更新难题

news2026/3/14 16:05:55
RAG技术是解决大模型知识更新缓慢和幻觉问题的关键技术。它通过检索增强生成让模型先检索相关文档再生成答案而非仅依赖静态记忆。文章详细介绍了RAG的三大核心阶段构建数据索引文档加载、分块、向量化、存储、检索查询向量化、相似度计算、Top K结果返回和增强生成提示词增强、LLM生成。通过公司HR制度智能问答系统的实战案例展示了RAG如何有效解决企业知识问答需求提高大模型应用的准确性和实用性。一、前言当你向最新的人工智能咨询马斯克的最新政策它却给你一份三年前的报告你好奇“林黛玉倒拔垂杨柳”的典故它竟煞有介事地描述起黛玉的“体能与植物学天赋”——这不是科幻剧情而是当下大模型时代真实存在的困境。我们正站在一个技术奇点模型越智能其“一本正经胡说八道”的幻觉风险越令人警惕数据越庞杂知识更新的迟缓越显突出。传统的微调与提示词工程已难以应对海量动态知识的吞噬速度。而一种被称为“AI 2.0时代杀手级应用”的技术——RAG检索增强生成正在悄然掀起一场“人机协作认知革命”。它不再让模型仅依赖训练时的静态记忆而是教会AI像人类一样先检索、再思考、后回答。本文将带你深入RAG的核心战场解密其如何通过“向量化记忆”“语义检索”“动态增强”三大引擎让大模型拥有实时查阅“外部知识库”的能力。我们将从零拆解一个企业级智能问答系统的构建全流程见证它如何精准回答“公司录用条件”等复杂制度问题——不只是技术更是AI落地生产力的关键一跃。如果你曾困惑于AI的“记忆偏差”或渴望构建更可靠、更实时的智能应用那么接下来的内容或许正是你寻找的“认知导航图”。二、为什么会有RAG大模型LLM基于大量数据训练的拥有巨量参数、展现涌现能力的模型。但实际应用中还是有一些比较棘手的问题。下面我们来看两个场景案例场景案例一分析评价马斯克政府效率部问题询问大模型知识库最新数据/询问最新的实事发现知识更新缓慢。场景案例二林黛玉倒拔垂杨柳案例问题大模型在某些情况下提问方式不对、模型知识欠缺下给出的回答很可能错误或者是涉及虚构甚至故意欺骗的信息这种回答被称为AI幻觉即大模型一本正经的胡说八道。模型应用开发解决方案我们了解的有提示词工程和微调。那么它们能够解决知识更新缓慢和幻觉问题吗提示词工程肯定不可以因为没有数据。微调只能够缓解不能彻底解决另微调准备数据和机器成本高。为了解决大语言模型知识库更新慢和幻觉问题提出了RAG解决方案且被称为AI2.0时代的杀手级应用。三、什么是RAG3.1、定义RAGRetrieval-Augmented Generation 检索增强生成是一种结合了检索和生成两种方法的技术。它通过先检索相关的文档用检索出来的信息对提示词进行增强再使用大模型生成答案。3.2、RAG 工作流程Native RAG 遵循一个传统的处理流程包括构建索引、检索和生成三个阶段。阶段一、构建数据索引1、加载不同来源、不同格式的文档将文本分割成块2、对切块的数据进行向量化3、将向量数据存储到向量数据库。阶段二、检索Retrieval4、对用户的Query进行文本切块5、对切块的Query通过向量化模型转化为向量再进行向量相似度检索6、返回与问题相关的Top K文本阶段三、增强生成Augmented Generation7、将检索召回的知识附加上下文填充至 Prompt 检索增强提示词输入至LLM生成请求响应8、生成响应回复。3.3、RAG研究范式演进注如果既生成文本、又包括图像、视频那么需要选择什么样的大模型呢大家自行思考、欢迎留言交流 _四、如何实现一个RAG阶段一、构建数据索引4.1、加载不同来源、不同格式的文档将文本分割成块切块算法1、固定字符数切分。2、按固定字符数 结合 overlapping window3、按照句子来切分4、递归方法 RecursiveCharacterTextSplitter为什么要进行分块通常块大小设置为多大分块Chunking 是数据预处理的核心步骤其目的是将长文本切分为更小的语义单元如段落或句子以提高检索效率和精度质量。成本平衡token的消耗。过小的块如单句可能导致语义碎片化丢失全局信息。过大的块如整章降低检索精度增加计算成本。最佳实践通常块大小设为256-1024 tokens重叠率10-20%并结合业务场景调整。4.2、对切块的数据进行向量化Embeding 向量化向量有大小有方向的量本质上是把Token转化成数组浮点数。如对“北京的雨”进行向量化1、分词切块“北京的雨”→[“北京”“的”“雨”]切块为 3 个 Token2、向量化 “北京”[4,2] “雨”[-1,2] “的”[2.5,4]方便大家理解我们把词投射到二维坐标中那如何进行向量化的呢本质上是基于统计学原理对大规模文本语料做计算得来的。神经网络就可以做这样的计算。那我们如何拿到文本的词向量专用于输出文本的词向量的神经网络模型就是我们所说的嵌入模型/向量模型。即可以通过在线向量模型或本地向量模型进行转化。各大MaaS平台中都有提供“向量模型”就是将文本转化为向量的模型。如阿里百炼平台上的向量模型千问。思考同样图片、视频是否也可以转化为向量如何通过向量模型进行向量化呢有两种方式。1、在线向量模型获取文本的词向量方式一可以通过在线向量模型即通过OpenAI方式调用。import os from openai import OpenAI client OpenAI( api_keyos.getenv(DASHSCOPE_API_KEY), # 如果您没有配置环境变量请在此处用您的API Key进行替换 base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1 # 百炼服务的base_url ) completion client.embeddings.create( modeltext-embedding-v3, input我爱你, dimensions1024, encoding_formatfloat ) print(completion.model_dump_json()) print(f向量维度,len(completion.data[0].embedding))返回结果{ data: [ { embedding: [ -0.0575992688536644, -0.017321519553661346, -0.10115918517112732, 0.037109408527612686, -0.025251852348446846, -0.000966983730904758, -0.004726422019302845, 0.06256995350122452, -0.03327704593539238, 0.031019367277622223, 0.016714412719011307, -0.02492932789027691, ....., -0.0032631997019052505 ], index: 0, object: embedding } ], model: text-embedding-v3, object: list, usage: { prompt_tokens: 18, total_tokens: 18 }, id: 111d53eb-d2f3-96c9-98eb-95d1fcda38b8 } 向量维度 1024向量维度 1024表示“我爱你” 这个token 通过“text-embedding-v3”这个模型向量化后由1024个浮点数表示。2、本地向量模型获取文本的词向量如果业务数据保密性安全性较高就不能用在线向量模型那我们可以通过方式二本地部署向量模型部署通过代码方式访问该模型获得文本的词向量。本地部署模型有多种方式可以通过Ollama方式来进行部署。也可以通过VLLM方式通过编码本地部署。说明入门级用Ollama企业级安装 用VLLM性能高充分利用GPU的资源。另外也可以借助Huggingfacehttps://huggingface.co/国内的镜像地址https://hf-mirror.com/或者 魔搭社区https://www.modelscope.cn/my/overview这里我们通过Ollama方式使用本地向量模型我们选择bge-m3BGE-M3是北京智源人工智能研究院BAAI推出的新模型以其多功能性、多语言支持和多粒度处理能力著称。在开源社区的基准测试中表现优异。1、下载向量模型(base) itbox192 ~ % ollama pull bge-m3 pulling manifest pulling manifest pulling manifest pulling daec91ffb5dd... 100% ▕██████████████████████▏ 1.2 GB pulling a406579cd136... 100% ▕██████████████████████▏ 1.1 KB pulling 0c4c9c2a325f... 100% ▕██████████████████████▏ 337 B verifying sha256 digest writing manifest success2、调用bge-m3向量模型获取嵌入向量import ollama def get_embedding(text, model_namebge-m3): # 使用ollama库获取嵌入向量 response ollama.embed(model_name, text) embedding response[embeddings] return embedding test_query 我爱你 vec get_embedding(test_query) print(vec[0]) # 我爱你 文本的嵌入表示的维度。 print(维度:,len(vec[0]))3、返回向量结果[ -0.03738617, 0.031213775, -0.003568891, 0.01037986, -0.002771229, 0.011527208, -0.0018695646, -0.034975536, -0.0064916234, 0.009741554, 0.0014897919, -0.006208201, 0.0096637225, 0.014243968, 0.05522222, 0.006646545, 0.023681909, ......, -0.027714828, -0.0061143995, -0.013703605, 0.008146641 ] 维度: 10241024表示 1024维度的向量坐标系将“我爱你” 转化为 1024个浮点数。说明以上通过在线向量和本地向量对文本进行向量化会发现不同的向量模型即使是相同的文本词向量也有可能不一样如不同的厂商阿里通义千问text-embedding-v3 和 智能研究院bge-m3主要原因语料来源不一样或向量的维度不一样。4.3、将向量存储到向量数据库索引过程中将文本转为向量化表示会产生很多的词向量需要保存谁来保存根据用户的查询检索过程中要进行向量相似度计算谁来计算答案就是向量数据库。在人工智能时代向量数据库已成为数据管理和AI模型不可或缺的一部分。向量数据库是一种专门设计用来存储和查询向量嵌入数据的数据库。1、目前市面上支持向量计算的数据库看横坐标分为两类纯向量数据库、支持向量检索的传统数据库。2、几个纯向量数据库的特点说明向量数据库特点说明Pinecone* 排名跟踪跟踪数据在搜索结果中的排名有助于优化和调整搜索策略 * 重复检测帮助用户识别和删除重复的数据 * 数据搜索快速搜索数据库中的数据支持复杂的搜索条件 * 分类对数据进行分类便于管理和检索 * 闭源商用收费Milvus* 毫秒级搜索万亿级向量数据集 * 简单管理非结构化数据 * 可靠的向量数据库始终可用 * 高度可扩展和适应性强支持分布式部署 * 混合搜索 * 受到社区支持得到行业认可企业应用较多 * 开源 * 中国创业公司ZILLIZ研发支持分布式部署适合于大项目Chroma* 功能丰富支持查询、过滤、密度估计等多种功能 * 很多开发框架如LangChain都支持 * 相同的API可以在Python笔记本中运行也可以扩展到集群用于开发、测试和生产闭源 * 轻量级、易用性易于集成和使用特别适合小型或中型项目‌ * 开源适合于中小型项目Faiss* 出身名门Meta起源于Meta的AI研究需求 * 可以同时搜索多个向量而不仅仅是单个向量批量处理 * 用于高效处理大规模密集向量相似度搜索 * 支持多种距离度量、丰富的索引结构、向量量化技术 * 高效的并行处理能力 * 腾讯率先在国内大规模应用。Faiss尤其适合用于图像检索和推荐系统倾向于社交应用如何进行向量数据库的选择 需要评估公司业务需求、团队的技术背景、公司的资源综合考虑成本、效率、质量来选择。我们的目标学习了解向量数据库所以选择Chroma简单易用。3、Chroma向量数据库应用chroma 安装(base) itbox192 ~ % pip install --upgrade chromadb4、通过chroma进行向量存储import os import chromadb from chromadb.config import Settings import json from openai import OpenAI from models import get_normal_client, ALI_TONGYI_API_KEY_OS_VAR_NAME, ALI_TONGYI_URL, \ ALI_TONGYI_EMBEDDING_MODEL #与向量模型建连 返回客户端 client OpenAI(api_keyos.getenv(ALI_TONGYI_API_KEY_OS_VAR_NAME), base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1) # 获取向量模型方法输入为文本、模型输出为向量(instructions, modelALI_TONGYI_EMBEDDING_MODEL) def get_embeddings(texts, modelALI_TONGYI_EMBEDDING_MODEL): data client.embeddings.create(inputtexts, modelmodel).data return [x.embedding for x in data] #打开train_zh.json文件并读取数据 with open(../../Data/train_zh.json, r, encodingutf-8) as f: data [json.loads(line) for line in f] #将读取的数据按字段拆出放入instructions和outputs中 #在这个业务中instruction因为需要被查询需要向量化output不必要 # 只取前10条数据 print(len(data)) instructions [entry[instruction] for entry in data[0:10]] outputs [entry[output] for entry in data[0:10]] print(instructions,instructions) print(outputs,outputs) #定义类负责和chromaDB进行交互接收文档转为向量、保存到Chroma里在Chroma里检索 class MyVectorDBConnector: def __init__(self, collection_name, embedding_fn): #如何把文档和向量进行本地存储不需要每次都去向量化一次 chroma_client chromadb.PersistentClient( path./chroma_data ) # 创建一个collection(容器或者集合)作用分类/隔离不同性质的数据相当于database self.collection chroma_client.get_or_create_collection(namecollection_name) #用来将文本转为向量实际上是我们前面的get_embeddings这个函数 self.embedding_fn embedding_fn # 文档或者向量存储到chromaDB中 def add_documents(self, instructions, outputs): print(len(instructions)) embeddings self.embedding_fn(instructions) print(len(embeddings)) self.collection.add( embeddingsembeddings, documentsoutputs, ids[fid{i} for i in range(len(outputs))] #chromaDB内部存储需要的Id值每个文档的ID ) #检索 def search(self, query, top_k): results self.collection.query( #把query这个人类语言的描述转为向量通过相似度去检索 query_embeddingsself.embedding_fn([query]), # 根据业务需要返回最相似的top_k个结果 n_resultstop_k ) return results #这里的 get_embeddings 是一个函数名作为参数传递的典型用法。在 Python 中函数本身是一等对象first-class object # 这意味着函数可以像变量一样被传递、赋值、作为参数传入函数或作为返回值返回。 vector_db MyVectorDBConnector(demo, get_embeddings) #往向量库中存放实际的文档 vector_db.add_documents(instructions, outputs) user_query 得了白癜风怎么办 results vector_db.search(user_query,2) print(results) for para in results[documents][0]: print(para \n)以上我们完成了构建数据索引具体把加载文本并对数据切块再通过向量模型把切块的数据转化为向量最后通过向量数据库进行存储。阶段二、检索Retrieval4.4、检索条件向量化将检索条件进行向量化这里需要强调的是 检索条件向量化的模型一定要与构建索引阶段的向量模型保持一致这里用的是阿里通义千问模型。# 获取向量模型方法输入为文本、模型输出为向量(instructions, modelALI_TONGYI_EMBEDDING_MODEL) def get_embeddings(texts, modelALI_TONGYI_EMBEDDING_MODEL): data client.embeddings.create(inputtexts, modelmodel).data return [x.embedding for x in data] # 调用 embeddings get_embeddings(query)4.5、向量间相似度计算查询条件向量与已有知识向量的相似度计算常用的向量相似度计算方法包括余弦相似度Cosine基于两个向量夹角的余弦值来衡量相似度。欧式距离L2通过计算向量之间的欧几里得距离来衡量相似度。点积计算两个向量的点积适合归一化后的向量。计算公式说明余弦相似度的意义它衡量的是两个向量的方向相似度与向量的长度大小无关。向量点积公式说明#RAG_向量的相似度计算.py #具体实现无需细究了解模型对向量相似度的计算值即可 import inspect import os import numpy as np from numpy import dot from numpy.linalg import norm from openai import OpenAI from models import get_normal_client, TENCENT_HUNYUAN_EMBEDDING_MODEL, ALI_TONGYI_API_KEY_OS_VAR_NAME, ALI_TONGYI_URL, \ ALI_TONGYI_MAX_MODEL, ALI_TONGYI_EMBEDDING_MODEL # api_key os.getenv(ALI_TONGYI_API_KEY_OS_VAR_NAME) # 如果您没有配置环境变量请在此处用您的API Key进行替换 # base_url https://dashscope.aliyuncs.com/compatible-mode/v1 # 百炼服务的base_url client OpenAI(api_keyos.getenv(ALI_TONGYI_API_KEY_OS_VAR_NAME), base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1) def cos_sim(a, b): 余弦相似度 -- 越大越相似 return dot(a, b) / (norm(a) * norm(b)) def l2(a, b): 欧式距离 -- 越小越相似 x np.asarray(a) - np.asarray(b) return norm(x) def get_embeddings(texts, modelALI_TONGYI_EMBEDDING_MODEL): # texts 是一个包含要获取嵌入表示的文本的列表 # model 则是用来指定要使用的模型的名称 # 生成文本的嵌入表示。结果存储在data中。 data client.embeddings.create(inputtexts, modelmodel).data print(ftexts,texts ,data, data) # 返回了一个包含所有嵌入表示的列表 return [x.embedding for x in data] # 且能支持跨语言 query 国际争端 documents [ 联合国就苏丹达尔富尔地区大规模暴力事件发出警告, 土耳其、芬兰、瑞典与北约代表将继续就瑞典“入约”问题进行谈判, 日本岐阜市陆上自卫队射击场内发生枪击事件 3人受伤, 国家游泳中心水立方恢复游泳、嬉水乐园等水上项目运营, 我国首次在空间站开展舱外辐射生物学暴露实验, ] query_vec get_embeddings([query])[0] doc_vecs get_embeddings(documents) print(余弦相似度:) print(cos_sim(query_vec, query_vec)) for vec in doc_vecs: print(f相似度值{cos_sim(query_vec, vec)}, 文档{documents[doc_vecs.index(vec)]}) print(\n欧式距离L2:) print(l2(query_vec, query_vec)) for vec in doc_vecs: print(f相似度值{l2(query_vec, vec)}, 文档{documents[doc_vecs.index(vec)]})返回结果余弦相似度: 1.0 0.5271489317503982 0.5025559880394109 0.41934433463201376 0.37540778084117127 0.35781769175435507 欧式距离L2: 0.0 0.9724721580712732 0.9974407490146702 1.0776415344068944 1.1176691861133594 1.1332980733279419说明通过余弦相似度计算两个向量的相似度时 – 值越大越相似通过欧式距离计算两个向量的相似度时–值越小越相似。当有了向量数据库后相识度计算由数据库进行计算。4.6、返回与问题相关的Top K文本返回与问题相关的Top K文本。import inspect import os import numpy as np from numpy import dot from numpy.linalg import norm from openai import OpenAI from models import get_normal_client, TENCENT_HUNYUAN_EMBEDDING_MODEL, ALI_TONGYI_API_KEY_OS_VAR_NAME, ALI_TONGYI_URL, \ ALI_TONGYI_MAX_MODEL, ALI_TONGYI_EMBEDDING_MODEL client OpenAI(api_keyos.getenv(ALI_TONGYI_API_KEY_OS_VAR_NAME), base_urlhttps://dashscope.aliyuncs.com/compatible-mode/v1) def l2(a, b): 欧式距离 -- 越小越相似 x np.asarray(a) - np.asarray(b) return norm(x) def get_embeddings(texts, modelALI_TONGYI_EMBEDDING_MODEL): # texts 是一个包含要获取嵌入表示的文本的列表 # model 则是用来指定要使用的模型的名称 # 生成文本的嵌入表示。结果存储在data中。 data client.embeddings.create(inputtexts, modelmodel).data print(ftexts,texts ,data, data) # 返回了一个包含所有嵌入表示的列表 return [x.embedding for x in data] # 且能支持跨语言 query 这个多少钱 documents [ 这个多少钱, 这个什么价格, 给我报个价, 我想要这个, 这个给我吧, ] query_vec get_embeddings([query])[0] doc_vecs get_embeddings(documents) print(\n欧式距离L2:) for vec in doc_vecs: print(f相似度值{l2(query_vec, vec)}, 文档{documents[doc_vecs.index(vec)]}) # 计算所有距离并存储为(距离, 文档)元组列表 distances [] for vec, doc in zip(doc_vecs, documents): distance l2(query_vec, vec) distances.append( (distance, doc) ) # 按距离升序排序距离越小越相似 sorted_distances sorted(distances, keylambda x: x[0]) # 取TOP3结果 top3 sorted_distances[:3] # 打印结果 print(\nTOP3相似结果:) for idx, (dist, doc) in enumerate(top3, 1): print(f第{idx}名 | 距离{dist:.16f} | 内容{doc})返回结果欧式距离L2: 相似度值0.0, 文档这个多少钱 相似度值0.4159325231430917, 文档这个什么价格 相似度值0.6593805919287012, 文档给我报个价 相似度值0.7210037342752621, 文档我想要这个 相似度值0.7402315395580321, 文档这个给我吧 TOP3相似结果: 第1名 | 距离0.0000000000000000 | 内容这个多少钱 第2名 | 距离0.4159325231430917 | 内容这个什么价格 第3名 | 距离0.6593805919287012 | 内容给我报个价TopK K一般设置为3-10个。大模型返回的结果的好坏如何进行量化召回率 和 准确度。阶段三、增强生成Augmented Generation4.7、提示词增强将检索召回的知识附加上下文填充至 Prompt 检索增强提示词输入至LLM生成请求响应#1、提示词的模版定义 prompt_template 你是一个问答机器人。 你的任务是根据下述给定的已知信息回答用户问题。 确保你的回复完全依据下述已知信息。不要编造答案。 如果下述已知信息不足以回答用户的问题请直接回复我无法回答您的问题。 已知信息: __INFO__ 用户问 __QUERY__ 请用中文回答用户问题。 #2、提示词增强(将检索返回的相似度数据和查询条件填充到提示词模版中进行增强 不定长传参 **kwargs ) def build_prompt(prompt_template, **kwargs): 将 Prompt 模板赋值 prompt prompt_template for k, v in kwargs.items(): if isinstance(v, str): val v elif isinstance(v, list) and all(isinstance(elem, str) for elem in v): val \n.join(v) else: val str(v) # 返回转换为大写的字符串副本 prompt prompt.replace(f__{k.upper()}__, val) return prompt #完成增强提示词和用大模型生成这两个步骤 llm模型 def get_completion(prompt, modelALI_TONGYI_MAX_MODEL): messages [{role: user, content: prompt}] response client.chat.completions.create( modelmodel, messagesmessages, temperature0, # 模型输出的随机性0 表示随机性最小 ) return response.choices[0].message.content #2、增强提示词 prompt build_prompt(prompt_template, INFOsearch_results[documents][0], QUERYuser_query) print(prompt) #3、用大语言模型生成答案 response get_completion(prompt)4.8、生成生成响应回复调用LLM大语言模型返回结果并进行对应的解析。五、实战案例—公司HR制度智能问答系统5.1、需求1、企业私有的HR制度知识我们有一份企业的知识文档。2、目标通过大模型技术来咨询公司视为不符合录用条件的情形有哪些?5.2、方案通过RAG技术来实现5.3、技术落地#RAG实现公司HR制度智能问答系统.py import os from openai import OpenAI from pdfminer.high_level import extract_pages from pdfminer.layout import LTTextContainer import chromadb from chromadb.config import Settings from docx import Document from models import get_normal_client, ALI_TONGYI_EMBEDDING_MODEL, ALI_TONGYI_API_KEY_OS_VAR_NAME, ALI_TONGYI_URL, ALI_TONGYI_MAX_MODEL # 创建客户端连接 client OpenAI(api_keyos.getenv(ALI_TONGYI_API_KEY_OS_VAR_NAME),base_urlALI_TONGYI_URL) # 定义向量数据库类 class MyVectorDBConnector: def __init__(self, collection_name, embedding_fn): chroma_client chromadb.Client(Settings(allow_resetTrue)) chroma_client.reset() self.collection chroma_client.get_or_create_collection(namecollection_name) self.embedding_fn embedding_fn #向 collection 中添加文档与向量 def add_documents(self, documents): batch_size 10 for i in range(0, len(documents), batch_size): batch_docs documents[i:i batch_size] self.collection.add( embeddingsself.embedding_fn(batch_docs), # 每个文档的向量 documentsbatch_docs, # 文档的原文 ids[fid{i} for i in range(i, i len(batch_docs))] # 每个文档的 id ) #检索向量数据库 def search(self, query, top_n): results self.collection.query( query_embeddingsself.embedding_fn([query]), n_resultstop_n ) return results # 读取Word文档 def extract_text_from_docx(filename, min_line_length1): 从 DOCX 文件中提取文字 paragraphs [] buffer full_text # 打开并读取文档 doc Document(filename) # 提取全部文本 for para in doc.paragraphs: print(para.text) print( * 30) if para.text.strip(): full_text para.text \n print(***30) print(full_text) print(***30) lines full_text.split(\n) for line in lines: #分块很粗糙展示分块有很多种方法 # 原文里的标题字数少一般小于10个字 #当前行的字数10个字认为它是个标题直接跳过把标题后的内容作为我要处理的内容进行分块 if len(line) min_line_length: buffer line elif buffer: paragraphs.append(buffer) buffer if buffer: paragraphs.append(buffer) print(paragraphs) return paragraphs # 使用嵌入模型进行向量化 def get_embeddings(texts, modelALI_TONGYI_EMBEDDING_MODEL): data client.embeddings.create(inputtexts, modelmodel).data return [x.embedding for x in data] #完成增强提示词和用大模型生成这两个步骤 # llm模型 def get_completion(prompt, modelALI_TONGYI_MAX_MODEL): messages [{role: user, content: prompt}] response client.chat.completions.create( modelmodel, messagesmessages, temperature0, # 模型输出的随机性0 表示随机性最小 ) return response.choices[0].message.content #提示词的模版 prompt_template 你是一个问答机器人。 你的任务是根据下述给定的已知信息回答用户问题。 确保你的回复完全依据下述已知信息。不要编造答案。 如果下述已知信息不足以回答用户的问题请直接回复我无法回答您的问题。 已知信息: __INFO__ 用户问 __QUERY__ 请用中文回答用户问题。 # 给Prompt模板赋值增强我们的提示词 #因为从向量库检索出的知识可能有多个处理上要花点手脚 def build_prompt(prompt_template, **kwargs): 将 Prompt 模板赋值 prompt prompt_template for k, v in kwargs.items(): if isinstance(v, str): val v elif isinstance(v, list) and all(isinstance(elem, str) for elem in v): val \n.join(v) else: val str(v) # 返回转换为大写的字符串副本 prompt prompt.replace(f__{k.upper()}__, val) return prompt # 定义 chat 函数 def rag_chat(vector_db, llm_api, user_query, n_results2): # 1、检索 search_results vector_db.search(user_query, n_results) print(search_results) #2、增强提示词 prompt build_prompt(prompt_template, INFOsearch_results[documents][0], QUERYuser_query) print(prompt) #3、用大语言模型生成答案 response llm_api(prompt) print(response) return response # 使用示例 docx_filename ../../Data/人事管理流程.docx # 1、读取Word文件 paragraphs extract_text_from_docx(docx_filename, min_line_length10) # 2、创建一个向量数据库对象 vector_db MyVectorDBConnector(demo, get_embeddings) # 3、向向量数据库中添加文档 vector_db.add_documents(paragraphs) print(vector_db.collection.count()) #4、检索 user_query 视为不符合录用条件的情形有哪些? result rag_chat(vector_db, get_completion, user_query) print(result)5.4、返回结果六、小结本文主要介绍对RAG的认知并通过一些案例进行讲解RAG的整个流程主要包括以下四方面1、在大模型的知识库更新慢和AI幻觉问题的大背景下产生了RAG解决方案2、什么是RAGRAG的工作流程和演进范式3、怎么样来实现一个RAG通过多个例子详细的讲解了RAG八个步骤的代码实现4、通过一个项目实战的Case公司HR制度智能问答系统来加强多RAG的理解同时分别使用了在线模型和本地模型进行演示。这里给大家精心整理了一份全面的AI大模型学习资源包括AI大模型全套学习路线图从入门到实战、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等资料免费分享扫码免费领取全部内容1. 成长路线图学习规划要学习一门新的技术作为新手一定要先学习成长路线图方向不对努力白费。这里我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。2. 大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF3. 大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。4. 2026行业报告行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。5. 大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。6. 大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。7. 资料领取全套内容免费抱走学 AI 不用再找第二份不管你是 0 基础想入门 AI 大模型还是有基础想冲刺大厂、了解行业趋势这份资料都能满足你现在只需按照提示操作就能免费领取扫码免费领取全部内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2411626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…