基于RAG的私人知识库聊天机器人

2024-06-20 16:44

本文主要是介绍基于RAG的私人知识库聊天机器人,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

随着人工智能的快速发展,特别是大语言模型的惊艳表现,让我们见证了信息检索和知识管理系统的重大进步。在这篇文章中,将探讨如何利用 Retrieval-Augmented Generation(RAG)技术,结合 MongoDB 数据库和 LangChain 框架,来构建一个先进的私人知识聊天机器人。

大模型聊天机器人的不足

在过去的这段时间,相信大家都领会到了生成式人工智能聊天机器人的魅力,它们展现出具有令人难以置信的能力,可以即时创建回复。然而,直接使用像 ChatGPT、ChatGLM、文心一言这样的模型生成的答案也存在问题。

幻觉

大语言模型有时也会生成所谓的 “幻觉” 文本,这些文本可能描述了现实中不存在的事件、人物或地点,导致以下问题:

  1. 现实与虚构混淆:模型无法准确区分历史事实与虚构内容,从而生成关于虚构事件或人物的响应,这可能误导那些寻求确凿信息的用户。
  2. 错误信息传播:当模型提供不真实或误导性的信息时,特别是在科学或医学领域,可能对公众造成误导,影响决策和信念体系。

无法访问私人信息

虽然大语言模型能够生成广泛的答案,但它们无法访问私人或定制化的信息,这限制了它们的应用范围:

  1. 缺乏个性化解答:这些模型通常无法访问用户的私人数据,如超出范围的历史记录或个人偏好,因此无法提供高度个性化的答案。
  2. 标准化回答的局限性:由于缺乏对用户特定需求的了解,这些模型生成的答案可能无法满足特定用户群体或行业的独特需求。

答案太笼统

大语言模型通常在提供答案时过于泛化,缺乏针对特定领域或行业的深度和专业性:

  1. 行业特定知识的缺乏:模型在处理涉及专业领域(如金融、法律或医疗)的查询时,可能无法提供足够专业的见解或详细的技术数据。
  2. 泛化与专业性的平衡:在努力适应广泛的查询类型时,模型可能难以在泛化能力和特定领域的深度知识之间找到平衡点,导致答案可能不足以满足专业人士或具有特定需求的用户的期望。

为了应对这些挑战,我们转向 Retrieval-Augmented Generation(RAG),即检索增强生成。RAG是一个人工智能框架,旨在从外部知识库中获取准确和最新的事实,它在大语言模型的生成过程中提供上下文和理解至关重要。

MongoDB Atlas 和 LangChain

MongoDB Atlas 向量搜索

MongoDB Atlas 作为向量数据库的优势:

  • MongoDB Atlas 与现有的MongoDB数据库无缝集成,使其成为已经在数据管理中使用 MongoDB 的组织的自然扩展。这确保了在不需要进行大规模系统改造的情况下,顺利过渡到向量存储。
  • MongoDB Atlas 专为处理大规模、运营关键的应用程序而设计,展示了其稳健性和可靠性。这在数据准确性和可用性至关重要的应用程序中变得特别关键,它的横向扩展能力确保了效率。
  • MongoDB Atlas 在处理各种数据类型和结构方面的灵活性,使其成为容纳向量嵌入复杂性的理想选择。
  • MongoDB Atlas 定位在企业级,拥有高安全标准、跨多个云的可用性和全面管理。这确保了组织可以信任它来实现安全、可靠和高效的操作。

LangChain 框架

LangChain 是一个强大的语言模型驱动应用程序框架,它改变了构建智能聊天机器人的规则。LangChain 的突出优势:

  • 上下文感知:LangChain 使应用程序,尤其是聊天机器人,能够根据来自各种来源的上下文信息(如提示指令和历史交互)进行理解和响应。
  • 推理能力:LangChain 赋予应用程序有效推理的能力,使它们能够根据提供的上下文做出明智的决策。

由 RAG 驱动的生成式 AI 聊天机器人实现

原理图解

image.png

建立知识库

加载数据

需要准备好获取问题回答所需的数据,这可以通过从网络资源、PDF、Word 文档以及其他可用的文本资料中提取信息来实现。这一步骤至关重要,因为数据的质量直接影响到机器人回答问题的能力。

生成嵌入

获取数据后,对其进行处理,将其分割成可管理的数据块,这有助于信息的高效处理。每个数据块都经过嵌入过程,这一转换过程将原始文本转换为数字表示形式,便于计算机分析。采用的嵌入方法还需确保在 MongoDB Atlas 中存储数据时的数据安全性与高效检索能力。

MongoDB 向量存储

为实现高效检索,生成的嵌入向量将存储在 MongoDB 中。MongoDB 提供了高效的存储方案,可以快速地对这些嵌入向量进行检索,这对于问答系统的快速响应至关重要。

RAG 问答

问题嵌入

当用户提出问题时,会生成该特定问题的嵌入。这一步骤准备好将问题与 MongoDB Atlas 中存储的数据进行比较。

检索相似的数据块

利用 MongoDB 的向量搜索功能,系统检索与提出的问题最匹配的相关数据块,这些数据块是在知识库中准备好的。

基于上下文和问题的提示词

检索到的数据块和用户问题合并后,创建一个包含全面上下文的查询。这个上下文为大语言模型(LLM)提供了必要的信息,使其能够基于全面的理解生成回答。

通过RAG进行定制答案生成

配备了上下文的大语言模型(如 GPT 或类似模型)利用 RAG(Retrieval-Augmented Generation)机制生成定制化的答案。这样的答案既符合用户的问题,也充分考虑了数据集中的信息,确保了回答的个性化和准确性。这一过程是生成式 AI 聊天机器人的核心,它结合了检索式和生成式方法,以提供更为准确和灵活的回答。

代码实现

python复制代码import os  
import re  
from openai import OpenAI  
import time  
from dotenv import load_dotenv  
from pymongo import MongoClient  
from langchain.chat_models import ChatOpenAI  
from langchain.schema import AIMessage, HumanMessage  
from langchain.llms import OpenAI  
from langchain.document_loaders import PyPDFLoader  
from langchain.text_splitter import RecursiveCharacterTextSplitter  
from langchain.embeddings import OpenAIEmbeddings  
from langchain.vectorstores import MongoDBAtlasVectorSearch  
from langchain.chains import RetrievalQA  
from langchain.schema.language_model import BaseLanguageModel  
import gradio as grload_dotenv(override=True)  # 连接 MongoDB 和 OpenAI
OPENAI_API_KEY = os.environ["OPENAI_API_KEY"]  
MONGO_URI = os.environ["MONGO_URI"]  
DB_NAME = "pdfchatbot"  
COLLECTION_NAME = "pdfText"  
ATLAS_VECTOR_SEARCH_INDEX_NAME = "vector_index"  embeddings = OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY)  EMBEDDING_FIELD_NAME = "embedding"  
TEXT_FIELD_NAME = "text"  client = MongoClient(MONGO_URI)  
db = client[DB_NAME]  
collection = db[COLLECTION_NAME]# PDF处理
def process_pdf(file,progress=gr.Progress()):  progress(0, desc="Starting")  time.sleep(1)  progress(0.05)  new_string = ""  for letter in progress.tqdm(file.name, desc="Uploading Your PDF into MongoDB Atlas"):  time.sleep(0.25)  loader = PyPDFLoader(file.name)  pages = loader.load_and_split()  print(pages)  text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)  docs = text_splitter.split_documents(pages)  docs_as_strings = [str(doc) for doc in docs]  vectorStore = MongoDBAtlasVectorSearch(  collection, embeddings, index_name=ATLAS_VECTOR_SEARCH_INDEX_NAME  )  docsearch = vectorStore.from_documents(  docs,  embeddings,  collection=collection,  index_name=ATLAS_VECTOR_SEARCH_INDEX_NAME,  )  return docsearch# 查询和显示    
def query_and_display(query,history):  history_langchain_format = []  for human, ai in history:  history_langchain_format.append(HumanMessage(content=human))  history_langchain_format.append(AIMessage(content=ai))  history_langchain_format.append(HumanMessage(content=query))  # Set up MongoDBAtlasVectorSearch with embeddings  vectorStore = MongoDBAtlasVectorSearch(collection,OpenAIEmbeddings(openai_api_key=OPENAI_API_KEY),index_name=ATLAS_VECTOR_SEARCH_INDEX_NAME,)  print(query)    print("---------------")  docs = vectorStore.max_marginal_relevance_search(query, K=5)  llm = OpenAI(openai_api_key=OPENAI_API_KEY, temperature=0)  retriever = vectorStore.as_retriever(search_type="similarity",search_kwargs={"k": 5},)  for document in retriever:  print(str(document) + "\n")  qa = RetrievalQA.from_chain_type(llm, chain_type="stuff",retriever=retriever)  retriever_output = qa.run(query)  print(retriever_output)  return retriever_output# 用户界面
with gr.Blocks(css=".gradio-container {background-color: AliceBlue}") as demo:  gr.Markdown("YBCarry Chatbot")  with gr.Tab("Upload PDF"):  with gr.Row():  pdf_input = gr.File()  pdf_output = gr.Textbox()  pdf_button = gr.Button("Upload PDF")  with gr.Tab("Ask question"):  gr.ChatInterface(query_and_display)  pdf_button.click(process_pdf, inputs=pdf_input, outputs=pdf_output)  demo.launch()

image.png

image.png

结语

通过RAG,我们开始着手解决与大语言模型相关的挑战,确保了精准答复和上下文相关的响应。跟随这一方向,相信大模型可以更好地服务于我们的日常和工作。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

这篇关于基于RAG的私人知识库聊天机器人的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1078688

相关文章

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

基于树梅派的视频监控机器人Verybot

最近这段时间做了一个基于树梅派 ( raspberry pi ) 的视频监控机器人平台 Verybot ,现在打算把这个机器人的一些图片、视频、设计思路进行公开,并且希望跟大家一起研究相关的各种问题,下面是两张机器人的照片:         图片1:                   图片2                    这个平台的基本组成是:

如何打造个性化大学生线上聊天交友系统?Java SpringBoot Vue教程,2025最新设计思路

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录

linux下TCP/IP实现简单聊天程序

可以在同一台电脑上运行,在一个终端上运行服务器端,在一个终端上运行客户端。 服务器端的IP地址要和本地的IP相同,并分配端口号,客户端的默认设置为本地,端口号自动分配。 服务器端: #include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.

C/C++ 网络聊天室在线聊天系统(整理重传)

知识点: TCP网络通信 服务端的流程: 1.创建socket套接字 2.给这个socket绑定一个端口号 3.给这个socket开启监听属性 4.等待客户端连接 5.开始通讯 6.关闭连接 解释: socket:类似于接口的东西,只有通过这个才能跟对应的电脑通信。 每一台电脑都有一个IP地址,一台电脑上有多个应用,每个应用都会有一个端口号。 socket一般分为两种类型,一种是通讯,一种是监听

【机器人工具箱Robotics Toolbox开发笔记(二十)】机器人工具箱SerialLink I类函数参数说明

机器人工具箱中的SerialLink表示串联机器人型机器人的具体类。该类使用D-H参数描述,每个关节一组。SerialLink I类包含的参数如表1所示。 表1 SerialLink I类参数 参  数 意    义 参  数 意    义 plot 显示机器人的图形表示 jacobn 工具坐标系中的雅可比矩阵 plot3D 显示机器人3D图形模型 Jacob_dot

机器人助力上下料搬运,加速仓库转运自动化

近年来,国内制造业领域掀起了一股智能化改造的浪潮,众多工厂纷纷采纳富唯智能提供的先进物流解决方案,这一举措显著优化了生产流程,实现了生产效率的飞跃式增长。得益于这些成功案例,某信息技术服务企业在工厂智能物流建设的进程中,也选择了与富唯智能合作。 为了应对日益增长的物料搬运需求,匹配成品输出节拍,该公司引入了富唯智能复合机器人AMR与搬运机器人AGV,实现了仓库成品搬运自动化,大幅减少人工

docker基于minio部署outline团队知识库

outline 介绍 Outline 是一个开源的Wiki 知识库和团队协作文档管理工具,美观、实时协作、功能丰富且兼容 Markdown,设计用于帮助团队和组织有效地创建、共享和管理文档。 Outline 具有简单易用的界面和强大的功能,可以替代传统的文档管理系统,如 Google Docs 或 Confluence。Outline 提供了一种结构化的方式来组织信息,使团队成员可以快速访问和

【最新华为OD机试E卷-支持在线评测】机器人活动区域(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线评测,专栏文章质量平均 94 分 最新华为OD机试目录: https://blog.

实现简单聊天

管道通信 目的: 实现 xxz 与 zy 之间的通讯聊天 功能: 同一网络下进行的模拟通讯实现 缺点:没有涉及到网络的通信,只是简单的进程之间模拟的通信 采用到的技术点: 1 有名管道 优点: 在文件系统中作为一个特殊的文件而存在,但管道中的内容却存放在内存中。 2 文件操作 3 多进程创建与回收 4 动态宏定义 【因为是写在一个程序中 模拟两个程序作用】 5 文件描述符操作