构建专属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 聊天机器人的核心,它结合了检索式和生成式方法,以提供更为准确和灵活的回答。

代码实现

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 gr

load_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大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值