利用Langchain的聊天机器人解决方案强化多个网站

利用Langchain聊天机器人解决方案,提升多个网站的效能

介绍

在人工智能革命时代,对话代理或聊天机器人已经成为各种数字平台上吸引用户、协助和提升用户体验的关键工具。由先进的人工智能技术驱动的聊天机器人能够进行自动化和交互式对话,仿佛人类之间的互动。随着ChatGPT的推出,回答用户查询的能力达到了新的高度。在自定义数据上构建诸如ChatGPT等聊天机器人可以帮助企业获得更好的用户反馈和体验。在本文中,我们将使用Retrieval Augmented Generation(RAG)技术在多个自定义网站上构建类似ChatGPT的Langchain聊天机器人解决方案。为了开始该项目,我们首先要了解构建这样一个应用所需的一些关键组件。

学习目标

以下是您将从这个项目中学到的内容:大型语言聊天模型

  • 在自定义数据上构建类似ChatGPT的聊天机器人。
  • 在Retrieval Augmented Generation(RAG)的需求下,使用核心组件如Loaders、Chunking和Embeddings构建类似ChatGPT的聊天机器人。
  • 使用Langchain的内存中向量数据库的重要性。
  • 使用ChatOpenAI聊天LLM实现RetrievalQA链。

本文是Data Science Blogathon的一部分。

Langchain是什么,为什么使用它?

要构建类似ChatGPT的聊天机器人,需要使用类似Langchain的框架。我们定义了用于创建响应的大型语言模型。在使用多个数据源时,请确保使用gpt-3.5-turbo-16k作为模型。这将占用更多的令牌。在使用时避免InvalidRequestError,使用这个模型名称。Langchain是一个开源框架,旨在推动由大型语言模型(LLMs)驱动的应用程序的发展。在其核心,LangChain便于创建具有重要属性和上下文感知的应用程序。这些应用程序将LLMs连接到自定义数据源,包括提示指令、少量示例和上下文内容。通过这种重要的集成,语言模型可以将其回应与提供的上下文联系起来,从而与用户进行更细腻和知情的互动。

LangChain提供了一个高级API,使得将语言模型连接到其他数据源和构建复杂应用程序变得简单。借助LangChain,您可以构建搜索引擎、高级推荐系统、电子书PDF摘要、问答代理、代码助手聊天机器人等等应用。

理解RAG- Retrieval Augmented Generation

大型语言模型在生成响应方面非常出色,它可以完成诸如代码生成、邮件写作、生成博客文章等各种任务。但是一个巨大的劣势是领域专业知识。当涉及回答领域特定问题时,大型语言模型通常容易产生幻觉现象。为了克服减少幻觉现象和用领域特定数据集对预训练的LLMs进行训练的挑战,我们使用一种称为Fine Tuning的方法。Fine Tuning减少了幻觉现象并且是使模型学习领域知识的最佳方式。但是这也带来了更高的风险。Fine Tuning需要训练时间和计算资源费用较高。

RAG拯救出现。Retrieval Augmented Generation(RAG)确保领域数据内容被提供给LLM,以产生与上下文相关和事实性的回应。RAG不仅获取知识,而且无需对LLM进行重新训练。这种方法减少了计算需求,并帮助组织在有限的培训基础设施上运作。RAG利用向量数据库,也有助于应用程序的扩展。

与多个网站交流的工作流程

该图展示了“与多个网站聊天”项目的工作流程。

让我们深入代码,了解工作流程中使用的组件。

安装

您可以使用pip命令安装LangChain。我们还可以安装OpenAI来设置API密钥。

pip install langchainpip install openaipip install chromadb tiktoken

让我们来设置OpenAI API密钥。

在这个项目中,我们将使用“ChatOpenAI”和“gpt-3.5-turbo-16k”模型以及“OpenAI embeddings”。这两个组件都需要OpenAI API密钥。要获取API密钥,请登录platform.openai.com

1. 登录您的账户后,点击个人资料,选择“查看API密钥”。

2. 点击“创建新的密钥”并复制您的API密钥。

根据语法使用os库创建环境变量,并粘贴您的API密钥。

import osos.environ['OPENAI_API_KEY'] = "sk-......zqBp" #replace the key

数据源- ETL(提取、转换和加载)

要构建像ChatGPT这样的聊天机器人应用程序,最基本的要求是自定义数据。对于这个项目,我们想要与多个网站聊天,所以需要定义网站的URL,并通过WebBaseLoader加载这个数据源。像WebBaseLoader这样的Langchain loader可以从各自的URL中提取数据内容。

from langchain.document_loaders import WebBaseLoaderURLS = [    'https://medium.com/@jaintarun7/getting-started-with-camicroscope-4e343429825d',    'https://medium.com/@jaintarun7/multichannel-image-support-week2-92c17a918cd6',    'https://medium.com/@jaintarun7/multi-channel-support-week3-2d220b27b22a'    ]loader = WebBaseLoader(URLS)data = loader.load()

切块

切块是指识别和分割句子中连续、不重叠的单词(或标记)组成的具有共同语法功能的特定语言任务。简单来说,切块有助于将大文本分解为较小的段落。Langchain提供了像CharacterTextSplitter这样的文本分裂器,它可以将文本分割成字符。

from langchain.text_splitter import CharacterTextSplittertext_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)websites_data = text_splitter.split_documents(data)

嵌入

对于处理文本的深度学习模型,需要将文本传入嵌入层。为了使模型学习上下文,切分的数据需要转换为嵌入。嵌入是一种将单词或标记转换为数值向量的方法。这种转换很重要,因为它允许我们将本质上是离散和符号的文本数据表示为连续的向量空间。每个单词或标记由一个唯一的向量表示。

from langchain.embeddings import OpenAIEmbeddingsembeddings = OpenAIEmbeddings()

向量数据库

实际的网站数据被提取并转换为向量形式的嵌入。向量数据库是一种在Chroma等数据库中存储嵌入的独特方法。向量数据库是机器学习和人工智能领域越来越受到欢迎的一种新型数据库。使用向量数据库的关键优势是因为搜索技术和相似性搜索。获得用户查询后,相似性搜索和检索的结果通常是与查询向量具有最高相似度分数的向量的排名列表。使用这种度量方式,应用程序确保返回实际回答。

一些常用和受欢迎的开源矢量数据库包括Chroma、Elastic Search、Milvus、Qdrant、Weaviate和FAISS。

from langchain.vectorstores import Chromawebsearch = Chroma.from_documents(websites_data, embeddings)

大型语言聊天模型

在此步骤中,我们定义了用于创建响应的大型语言模型。在使用多个数据源时,请确保使用gpt-3.5-turbo-16k作为模型。这将占用更多的令牌。请使用此模型名称,避免InvalidRequestError。

from langchain.chat_models import ChatOpenAImodel = ChatOpenAI(model='gpt-3.5-turbo-16k',temperature=0.7)

用户提示和检索

我们已经到达项目的最后一部分,在这部分中,我们获取输入提示并使用矢量数据库检索器检索输入提示的相关上下文。RetrievalQA将大型语言模型和矢量数据库堆叠在一起,从而提供更好的响应。

from langchain.chains import RetrievalQArag = RetrievalQA.from_chain_type(llm=model, chain_type="stuff", retriever=websearch.as_retriever())prompt = "Write code implementation for Multiple Tif image conversion into RGB"response = rag.run(prompt)print(response)

输出

整合所有内容

#installation!pip install langchain openai tiktoken chromadb#import required librariesimport osfrom getpass import getpassfrom langchain.document_loaders import WebBaseLoaderfrom langchain.text_splitter import CharacterTextSplitterfrom langchain.embeddings import OpenAIEmbeddingsfrom langchain.vectorstores import Chromafrom langchain.chains import RetrievalQAfrom langchain.chat_models import ChatOpenAI#set up OpenAI API Keyapi_key = getpass()os.environ['OPENAI_API_KEY'] = api_key#ETL=> load the dataURLS = [    'https://medium.com/@jaintarun7/getting-started-with-camicroscope-4e343429825d',    'https://medium.com/@jaintarun7/multichannel-image-support-week2-92c17a918cd6',    'https://medium.com/@jaintarun7/multi-channel-support-week3-2d220b27b22a'    ]loader = WebBaseLoader(URLS)data = loader.load()#Chunking => Text Splitter into smaller tokenstext_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)websites_data = text_splitter.split_documents(data)#create embeddingsembeddings = OpenAIEmbeddings()#store embeddings and the data inside Chroma - vector databasewebsearch = Chroma.from_documents(websites_data, embeddings)#define chat large language model-> 16K token sizemodel = ChatOpenAI(model='gpt-3.5-turbo-16k',temperature=0.7)Is LangChain a library or framework?#retrieval chainrag = RetrievalQA.from_chain_type(llm=model, chain_type="stuff", retriever=websearch.as_retriever())#retrieve relevant outputprompt = "Write code implementation for Multiple Tif image conversion into RGB"#run your queryresponse = rag.run(prompt)print(response)

结论

总结一下,我们成功地使用Langchain构建了针对多个网站的聊天机器人。这不仅仅是一个简单的聊天机器人。相反,它是一个能够像ChatGPT一样回答您的数据的聊天机器人。本文的关键要点如下:

  • Langchain是最强大的开源大型语言模型框架,可帮助构建类似ChatGPT的聊天机器人。
  • 我们讨论了预训练模型的不同挑战,以及如何使用检索增强生成(Retrieval Augmented Generation)方法比微调更合适。另外,需要注意的是:在大多数情况下,微调更倾向于获得更加准确的回答。
  • 要构建类似ChatGPT的聊天机器人,我们准备了一个项目工作流程,其中包括加载器、分块、嵌入、矢量数据库和聊天语言模型等核心组件。
  • 矢量数据库是RAG(Retrieval Augmented Generation)流水线的关键优势。本文还提到了一些受欢迎的开源矢量数据库。

这个项目用例激发了您对Langchain和RAG潜力的探索。

常问问题

本文显示的媒体资源不归Analytics Vidhya所有,仅根据作者的决定使用。