赞
踩
随着人工智能的快速发展,特别是大语言模型的惊艳表现,让我们见证了信息检索和知识管理系统的重大进步。在这篇文章中,将探讨如何利用 Retrieval-Augmented Generation(RAG)技术,结合 MongoDB 数据库和 LangChain 框架,来构建一个先进的私人知识聊天机器人。
在过去的这段时间,相信大家都领会到了生成式人工智能聊天机器人的魅力,它们展现出具有令人难以置信的能力,可以即时创建回复。然而,直接使用像 ChatGPT、ChatGLM、文心一言这样的模型生成的答案也存在问题。
大语言模型有时也会生成所谓的 “幻觉” 文本,这些文本可能描述了现实中不存在的事件、人物或地点,导致以下问题:
虽然大语言模型能够生成广泛的答案,但它们无法访问私人或定制化的信息,这限制了它们的应用范围:
大语言模型通常在提供答案时过于泛化,缺乏针对特定领域或行业的深度和专业性:
为了应对这些挑战,我们转向 Retrieval-Augmented Generation(RAG),即检索增强生成。RAG是一个人工智能框架,旨在从外部知识库中获取准确和最新的事实,它在大语言模型的生成过程中提供上下文和理解至关重要。
MongoDB Atlas 作为向量数据库的优势:
LangChain 是一个强大的语言模型驱动应用程序框架,它改变了构建智能聊天机器人的规则。LangChain 的突出优势:
需要准备好获取问题回答所需的数据,这可以通过从网络资源、PDF、Word 文档以及其他可用的文本资料中提取信息来实现。这一步骤至关重要,因为数据的质量直接影响到机器人回答问题的能力。
获取数据后,对其进行处理,将其分割成可管理的数据块,这有助于信息的高效处理。每个数据块都经过嵌入过程,这一转换过程将原始文本转换为数字表示形式,便于计算机分析。采用的嵌入方法还需确保在 MongoDB Atlas 中存储数据时的数据安全性与高效检索能力。
为实现高效检索,生成的嵌入向量将存储在 MongoDB 中。MongoDB 提供了高效的存储方案,可以快速地对这些嵌入向量进行检索,这对于问答系统的快速响应至关重要。
当用户提出问题时,会生成该特定问题的嵌入。这一步骤准备好将问题与 MongoDB Atlas 中存储的数据进行比较。
利用 MongoDB 的向量搜索功能,系统检索与提出的问题最匹配的相关数据块,这些数据块是在知识库中准备好的。
检索到的数据块和用户问题合并后,创建一个包含全面上下文的查询。这个上下文为大语言模型(LLM)提供了必要的信息,使其能够基于全面的理解生成回答。
配备了上下文的大语言模型(如 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 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()
通过RAG,我们开始着手解决与大语言模型相关的挑战,确保了精准答复和上下文相关的响应。跟随这一方向,相信大模型可以更好地服务于我们的日常和工作。
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
保证100%免费
】Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。