一、当地知识库 搭建
1、大模子弊端
大模子弊端 : 大模子 有强大的 语言处理处罚和理解 能力 , 但是 大模子自己并不具备 最新的数据 以及 特定领域的专有数据 , 一旦大模子没有相干知识内容 , 就会出现 " 幻觉 " , 开始 胡编乱造 ;
- 数据迟滞 : 大模子 训练数据 往往存在一定的时滞性 , 如 : 1 月收集的数据 开始训练 , 要花半年才能训练完毕 , 使用大模子时是没有近来半年的数据的 ;
- 数据缺失 : 特定领域的专业数据 也大概并不包含在大模子的训练集中 , 如 : 公司或行业的 保密数据 , 商业机密等 ; 大模子 在答复相干领域问题时 缺乏正确性 ;
2、向量数据库 -> 当地知识库
为了克服 大模子的 数据迟滞 和 数据缺失 弊端 , 可以通过 向量数据库 来 构建一个当地化的 知识库 , 以实现 特定领域知识 的 及时更新 , 进而 开发基于 当地知识库的智能问答体系 ;
当地知识库 作为 大模子的增补 , 存储
当地知识库 到场 提示词构建 : 通过 向量数据库 的 向量检索技能 , 我们可以 快速、正确地从知识库 中提取出与用户查询相干的信息 , 然后将当地知识 构建到 Prompt 提示词 中 ;
当地知识库 数据维护 : 当地知识库 应该 创建一套美满的 知识库 更新机制 , 当新的 数据或领域知识 出现时 , 可以及时 将 新知识 添加到 向量数据库 中 , 确保 当地知识库始终 保持最新、最全面的状态 ;
通过向量数据库搭建当地知识库 , 并实现领域知识的及时更新 , 可以有效解决大模子缺乏最新数据和特定领域专有数据的问题 , 充分使用 当地知识库 中的最新数据和专有知识 , 进步 大模子输出的正确性 ;
二、RAG 检索增强天生 三阶段
1、RAG 三阶段简介
RAG ( Retrieval-Augmented Generation , 检索增强天生 )是一种联合 信息检索 与 天生模子 的技能 , 通过 外部知识库 提拔 天生内容的 正确性 和 相干性 ;
RAG 流程可分为 三阶段 :
- 检索 Retrieval : 向量相似度 匹配当地知识
- 增强 Augmented : 当地知识库信息 注入提示词
- 天生 Generation : 大模子整合提示词 输出
RAG 积极意义 :
- 动态知识更新 : 无需 重新训练模子 即可通过 更新 当地知识库 适应 新领域数据 或 及时数据 ;
- 可表明性增强 : 天生效果可追溯至检索内容 , 便于验证来源可信度。
RAG 适用场景 : 问答体系、客服对话、长文本天生(如陈诉撰写)等需联合外部知识的使命 ;
2、RAG 三阶段 流程图
使用 Mermaid 语法绘制流程图 :
- graph TD
- A[用户提出问题] --> B{查询 本地 向量数据库}
- B --> C[根据 语义相似度 获取本地知识]
- C --> D[Prompt 提示词构建]
- D --> E{提示词 输入 大模型}
- E --> F[获得最终回答]
复制代码 用户提出问题
查询 当地 向量数据库
根据 语义相似度 获取当地知识
Prompt 提示词构建
提示词 输入 大模子
获得终极答复
graph 是指要绘制的图表类型 ,
- TD 是 指方向为 自上而下 Top Down
- LR 从左到右
- BT 从下到上
- RL 从右到左
3、检索 Retrieval - 向量相似度匹配
从 当地知识库 中快速 定位 与用户查询 最相干的信息片段 , 涉及到如下技能 :
- 文本向量转化 : 使用 嵌入模子 ( 文本向量模子 ) , 如 : BERT、Sentence-BERT , 将 当地知识 转换为高维向量 ;
- 文本向量相似度计算 : 通过 余弦间隔 或 欧氏间隔 衡量查询向量与文档向量间的相干性 ;
- 向量高效检索 : 借助近似近来邻算法(如FAISS、HNSW)或 搜刮引擎(如Elasticsearch)加快大规模向量匹配 ; 这里保举使用 向量数据库 ;
- 关键技能问题 : 平衡检索速率与正确性 , 处理处罚不同语言的语义多样性 , 如 : 同义词、多义词 ;
4、增强 Augmented - 知识库信息注入
将检索到的关键信息整合到天生模子的输入中 , 也就是 Prompt 提示词 , 引导 大语言模子 天生更可靠的答复 ;
- 提示工程 : 在输入提示中拼接检索到的文本(如“基于以下内容答复:[检索效果]+用户问题”)。
- 注意力增强 : 通过模子架构计划(如Fusion-in-Decoder),让天生过程更聚焦于检索内容。
- 淘汰幻觉 : 淘汰天生模子的“幻觉”(假造事实),提拔答复的可信度。
- 关键问题 : 过滤噪声信息,制止信息过载对天生质量的影响。
5、天生 Generation - 大模子整合输出
基于检索信息和模子内部知识,天生自然、连贯且正确的终极答复。
- 模子选择 : 通常采用大语言模子(如GPT-4、Llama、PaLM),使用其强大的语言理解和天生能力。
- 天生策略 : 根据场景选择束搜刮(保证连贯性)或采样(增长多样性),并大概参加后处理处罚(如去重、引用标注)。
- 关键技能点 : 答复的正确性、与检索内容的一致性,以及逻辑流畅性。
三、完整代码示例
1、天生当地知识库代码示例
当使用 RAG 服务时 , 首先从该 chroma_db 向量数据 中的 news_articles 聚集 中 , 搜刮 指定个数 的 相似效果 , 然后将这些相似的 文本 拼接到 提示词 中 , 再将提示词输入到 LLM 大语言模子 中 , 得到输出效果 ;
代码示例 ( 可独立运行 ) :
- # 导入所需库
- import chromadb # ChromaDB 向量数据库
- from openai import OpenAI # OpenAI 客户端
- # 初始化 OpenAI 客户端 (替换成自己的 API 信息)
- client = OpenAI(
- api_key="sk-i3daF6", # 替换为你的 OpenAI API Key , 这里我把自己的 API-KEY 隐藏了
- base_url="https://api.xiaoai.plus/v1" # 替换为你的 API 服务端点
- )
- def get_embeddings(texts, model="text-embedding-ada-002"):
- """将文本转换为向量表示
- Args:
- texts: 需要编码的文本列表
- model: 使用的嵌入模型(默认OpenAI官方推荐模型)
- Returns:
- 包含向量数据的列表,每个元素对应输入文本的768维向量
- """
- response = client.embeddings.create(
- input=texts,
- model=model
- )
- # 从响应中提取向量数据
- return [item.embedding for item in response.data]
- # 初始化 ChromaDB 客户端 (持久化到本地目录)
- chroma_client = chromadb.PersistentClient(path="chroma_db")
- # 创建或获取集合 (相当于数据库表)
- collection = chroma_client.get_or_create_collection(
- name="news_articles", # 集合名称
- metadata={"hnsw:space": "cosine"} # 使用余弦相似度
- )
- # 原始文本数据集(示例新闻标题)
- documents = [
- "李彦宏称大模型成本每年降低90%", # 科技类
- "乌军大批直升机击落多架俄无人机", # 国际争端
- "王力宏回应是否想找新伴侣", # 娱乐新闻
- "饺子不知道观众怎么想出的藕饼cp", # 影视相关
- "加沙停火协议关键时刻生变" # 国际争端
- ]
- # 批量生成文档向量(OpenAI API调用)
- document_embeddings = get_embeddings(documents)
- # 生成唯一文档 ID (需要唯一标识符)
- document_ids = [str(i) for i in range(len(documents))] # 生成 ["0", "1", ..., "4"]
- # 将文档插入数据库
- collection.add(
- ids=document_ids, # 唯一ID列表
- embeddings=document_embeddings, # 文本向量列表
- documents=documents # 原始文本列表
- )
复制代码 2、天生当地知识库执行效果
上述代码执行后 , 在当地天生数据库文件 ;
3、RAG 服务实现
RAG 流程可分为 三阶段 : 这 三个阶段 , 分别有对应的代码模块 ;
- 检索 Retrieval : 向量相似度 匹配当地知识
- 增强 Augmented : 当地知识库信息 注入提示词
- 天生 Generation : 大模子整合提示词 输出
① 检索 Retrieval 模块
检索 Retrieval : 向量相似度 匹配当地知识
- 首先 , 获取 chroma_db 向量数据库 以及 数据库 中的 news_articles 聚集 ( 数据库表 ) , 这是 上一步 创建的 chromadb 向量数据库表 ;
- # 初始化向量数据库连接
- chroma_client = chromadb.PersistentClient(path="chroma_db")
- # 创建或获取集合 (相当于数据库表)
- collection = chroma_client.get_or_create_collection(
- name="news_articles", # 集合名称
- metadata={"hnsw:space": "cosine"} # 使用余弦相似度
- )
复制代码
- # 1. 向量检索, 生成查询向量, 将文本转为向量
- query_embedding = get_embeddings([user_query])[0]
复制代码
- 末了 , 从 news_articles 数据库表 中 , 查询 目标文本向量 中最相近的 2 个文本 ;
- # 执行相似性查询
- search_results = collection.query(
- query_embeddings=[query_embedding], # 查询向量
- n_results=2 # 返回前2个最相似结果
- )
复制代码 ② 增强 Augmented 模块
增强 Augmented : 当地知识库信息 注入提示词
- 首先 , 给定一个提示词模板 prompt_template , 此中的 __INFO__ 需要替换为 向量数据库 中查询的内容 , __QUERY__ 需要替换为 用户的提问 ;
- # 提示词模板(控制模型输出格式)
- prompt_template = """
- 你是一名国际军事问题专家。你的任务是根据现有知识库和用户问题给出最佳答案。
- 已知信息 :
- __INFO__
- 用户提问 :
- __QUERY__
- """
复制代码
- 然后 , 使用下面 的 build_prompt 函数 , 处理处罚上述 提示词模板 , 分别传入 info=search_results['documents'][0] 和 query=user_query 两个 键值对参数 , 这样就将 __INFO__ 和 __QUERY__ 替换为了指定的文本 ;
- def build_prompt(**kwargs):
- """动态构建提示词
- Args:
- prompt_template: 提示词模板字符串
- **kwargs: 需要替换的键值对(自动匹配__KEY__占位符)
- Returns:
- 完成替换后的完整提示词
- """
- 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)
- print("构建提示词:" + prompt)
- return prompt
复制代码
- # 2. 构建增强提示
- prompt = build_prompt(
- info=search_results['documents'][0], # 取最相关结果
- query=user_query
- )
复制代码 ③ 天生 Generation 模块
天生 Generation 模块 很简单 , 就是个 普通的 LLM 问答模块 , 调用下面的 函数 , 传入 构建好的 Prompt 提示词 , 完成 问答 ,得到一个 LLM 输出的内容 ;
- def get_completion(prompt, model="gpt-3.5-turbo"):
- """封装OpenAI API调用
- Args:
- prompt: 完整的提示词内容
- model: 选择的大模型版本(默认gpt-3.5-turbo)
- Returns:
- 模型生成的文本响应
- """
- messages = [{"role": "user", "content": prompt}]
- response = client.chat.completions.create(
- model=model,
- messages=messages,
- temperature=0, # 控制输出随机性(0为最确定性输出)
- )
- return response.choices[0].message.content # 提取响应内容
复制代码 实际的调用代码如下 :
- # 3. 调用大模型生成
- return self.llm_api(prompt)
复制代码 ④ 完整代码
完整代码示例 ( 可独立运行 ) : 下面的代码中 , 替换成自己的 OpenAI 的 api_key 和 base_url 即可 , 注意 Python 要使用 3.9 以上版本 , 否则无法成功安装 chromadb 向量数据库 ;
- import chromadbfrom openai import OpenAI# 初始化 OpenAI 客户端 (替换成自己的 API 信息)client = OpenAI( api_key="sk-i3dHqaF6", # 替换为你的 OpenAI API Key , 这里我把自己的 API-KEY 隐蔽了 base_url="https://api.xiaoai.plus/v1" # 替换为你的 API 服务端点)# 提示词模板(控制模型输出格式)
- prompt_template = """
- 你是一名国际军事问题专家。你的任务是根据现有知识库和用户问题给出最佳答案。
- 已知信息 :
- __INFO__
- 用户提问 :
- __QUERY__
- """
- def build_prompt(**kwargs):
- """动态构建提示词
- Args:
- prompt_template: 提示词模板字符串
- **kwargs: 需要替换的键值对(自动匹配__KEY__占位符)
- Returns:
- 完成替换后的完整提示词
- """
- 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)
- print("构建提示词:" + prompt)
- return prompt
- def get_completion(prompt, model="gpt-3.5-turbo"):
- """封装OpenAI API调用
- Args:
- prompt: 完整的提示词内容
- model: 选择的大模型版本(默认gpt-3.5-turbo)
- Returns:
- 模型生成的文本响应
- """
- messages = [{"role": "user", "content": prompt}]
- response = client.chat.completions.create(
- model=model,
- messages=messages,
- temperature=0, # 控制输出随机性(0为最确定性输出)
- )
- return response.choices[0].message.content # 提取响应内容
- def get_embeddings(texts, model="text-embedding-ada-002"): """将文本转换为向量表现 Args: texts: 需要编码的文本列表 model: 使用的嵌入模子(默认OpenAI官方保举模子) Returns: 包含向量数据的列表,每个元素对应输入文本的768维向量 """ response = client.embeddings.create( input=texts, model=model ) # 从相应中提取向量数据 return [item.embedding for item in response.data]class RAG_Service: def __init__(self, vector_db, llm_api, n_results=2): """初始化RAG机器人 Args: vector_db: 已初始化的向量数据库连接对象 llm_api: 大模子API调用函数 n_results: 默认检索效果数目 """ self.vector_db = vector_db # 向量数据库实例 self.llm_api = llm_api # LLM调用接口 self.n_results = n_results # 检索效果数目 def chat(self, user_query): """处理处罚用户查询的完整流程 Args: user_query: 用户输入的自然语言问题 Returns: 联合知识库天生的答复 """ # 1. 向量检索, 生成查询向量, 将文本转为向量
- query_embedding = get_embeddings([user_query])[0]
- # 执行相似性查询
- search_results = collection.query(
- query_embeddings=[query_embedding], # 查询向量
- n_results=2 # 返回前2个最相似结果
- )
- # 2. 构建增强提示
- prompt = build_prompt(
- info=search_results['documents'][0], # 取最相关结果
- query=user_query
- )
- # 3. 调用大模型生成
- return self.llm_api(prompt)
- # RAG 使用示例if __name__ == "__main__": # 初始化向量数据库连接
- chroma_client = chromadb.PersistentClient(path="chroma_db")
- # 创建或获取集合 (相当于数据库表)
- collection = chroma_client.get_or_create_collection(
- name="news_articles", # 集合名称
- metadata={"hnsw:space": "cosine"} # 使用余弦相似度
- )
- # 创建 RAG 实例 bot = RAG_Service( vector_db=collection, llm_api=get_completion ) # 示例查询 user_query = "你对国际争端新闻的评价" # 天生查询向量 query_embedding = get_embeddings([user_query])[0] # RAG 答复 response = bot.chat(user_query) print("RAG 体系答复:", response)
复制代码 4、RAG 服务 执行效果
代码执行后 , 用户提出的问题是 " 你对国际争端新闻的评价 " ,
从当地知识库中 , 查询 与 用户问题 相似的 知识文档 , 查询效果是 :
- 加沙停火协议关键时刻生变
- 乌军大批直升机击落多架俄无人机
复制代码 将上述查询效果 , 拼接到 提示词中 , 则 完整的提示词为 :
- 你是一名国际军事问题专家。你的使命是根据现有知识库和用户问题给出最佳答案。已知信息 : 加沙停火协议关键时刻生变
- 乌军大批直升机击落多架俄无人机
- 用户提问 : 你对国际争端新闻的评价
复制代码 将上述提示词 输入到 OpenAI 大模子 中 , 得到的效果为 : " 作为国际军事问题专家,我认为国际争端新闻总是令人担忧的。加沙停火协议的变革和乌克兰军队击落俄罗斯无人机的事件都表明国际局势仍然不稳定。这些事件大概会导致更多的紧张局势和辩说,需要各方保持冷静和谨慎,寻求通过对话和外交手段解决分歧。国际争端的解决需要各方共同积极,制止采取激烈的行动,以制止进一步升级局势。 "
执行效果 :
- D:\001_Develop\022_Python\Python39\python.exe D:/002_Project/011_Python/OpenAI/rag_service.py构建提示词:你是一名国际军事问题专家。你的使命是根据现有知识库和用户问题给出最佳答案。已知信息 : 加沙停火协议关键时刻生变
- 乌军大批直升机击落多架俄无人机
- 用户提问 : 你对国际争端新闻的评价RAG 体系答复: 作为国际军事问题专家,我认为国际争端新闻总是令人担忧的。加沙停火协议的变革和乌克兰军队击落俄罗斯无人机的事件都表明国际局势仍然不稳定。这些事件大概会导致更多的紧张局势和辩说,需要各方保持冷静和谨慎,寻求通过对话和外交手段解决分歧。国际争端的解决需要各方共同积极,制止采取激烈的行动,以制止进一步升级局势。Process finished with exit code 0
复制代码
CSDN独家福利
末了,感谢每一个认真阅读我文章的人,礼尚往来总是要有的,下面资料虽然不是什么很值钱的东西,假如你用得到的话可以直接拿走:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |