首页 > 其他分享 >LangChain教程 – 如何构建自定义知识聊天机器人

LangChain教程 – 如何构建自定义知识聊天机器人

时间:2023-06-03 09:44:05浏览次数:60  
标签:教程 chain 自定义 AI LangChain langchain LLM import

您可能已经了解到过去几个月发布的大量 AI 应用程序。您甚至可能已经开始使用其中的一些。

ChatPDF和CustomGPT AI等 AI 工具已经对人们变得非常有用——这是有充分理由的。您需要滚动浏览 50 页文档才能找到简单答案的日子已经一去不复返了。相反,您可以依靠 AI 来完成繁重的工作。

但是这些开发人员究竟是如何创建和使用这些工具的呢?好吧,他们中的许多人都在使用一个名为 LangChain 的开源框架。

在本文中,我将向您介绍 LangChain,并向您展示如何将其与 OpenAI 的 API 结合使用来创建这些改变游戏规则的工具。希望我能激发你们中的一员提出自己的想法。让我们开始吧!

(人工智能教程:https://www.java567.com/search.html?sWord=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&v=2306035

浪链是什么?

截图-2023-05-29-at-5.40.38-PM

LangChain是一个开源框架,允许 AI 开发人员将 GPT-4 等大型语言模型 (LLM) 与外部数据相结合。它以 Python 或 JavaScript (TypeScript) 包的形式提供。

如您所知,GPT 模型一直在 2021 年之前接受数据训练,这可能是一个重大限制。虽然这些模型的常识很丰富,但能够将它们连接到自定义数据和计算会打开许多大门。这正是 LangChain 所做的。

从本质上讲,它允许您的 LLM 在得出答案时参考整个数据库。因此,您现在可以让 GPT 模型以报告、文档和网站信息的形式访问最新数据。

最近,LangChain 的人气大幅飙升,尤其是在 3 月份推出 GPT-4 之后。这要归功于它的多功能性以及与强大的 LLM 搭配使用时打开的许多可能性。

LangChain 如何运作?

虽然您可能认为 LangChain 听起来很复杂,但实际上它很容易上手。

简而言之,LangChain 只是将大量数据组合在一起,LLM 可以使用尽可能少的计算能力轻松引用这些数据。它的工作原理是获取大量数据源,例如 50 页的 PDF,并将其分解为“块”,然后嵌入到 Vector Store 中。

------朗链创建向量存储的简单示意图

现在我们已经有了大型文档的矢量化表示,我们可以将其与 LLM 结合使用,以仅检索在创建提示-完成对时需要引用的信息。

当我们在新的聊天机器人中插入提示时,LangChain 将查询 Vector Store 以获取相关信息。将其视为您文档的迷你 Google。检索到相关信息后,我们会将其与提示一起提供给 LLM 以生成我们的答案。

字节大小缩略图--1200---800-px---10-LangChain 如何与 OpenAI 的 LLM 合作

LangChain 还允许您创建可以执行操作的应用程序——例如上网冲浪、发送电子邮件和完成其他与 API 相关的任务。查看AgentGPT,这是一个很好的例子。

这有很多可能的用例——这里只是我想到的几个:

  • 个人 AI 邮件助理

  • 人工智能学习伙伴

  • 人工智能数据分析

  • 定制公司客户服务聊天机器人

  • 社交媒体内容创作助理

而这样的例子不胜枚举。我将在以后的文章中介绍正确的构建教程,敬请期待。

如何开始使用朗链

LangChain 应用程序由 5 个主要组件组成:

  1. 模型(LLM 包装器)

  2. 提示

  3. 链条

  4. 嵌入和向量存储

  5. 代理商

我将为您提供每一个的概述,以便您可以更深入地了解 LangChain 的工作原理。展望未来,您应该能够应用这些概念来开始制作您自己的用例并创建您自己的应用程序。

我将使用来自 Rabbitmetrics的简短代码片段来解释所有内容。他提供了有关此主题的精彩教程。这些片段应该可以让您完成所有设置并准备好使用 LangChain。

首先,让我们设置环境。您可以 pip 安装 3 个您需要的库:

 pip install -r requirements.txt
 python-dotenv==1.0.0
 langchain==0.0.137
 pinecone-client==2.2.1

Pinecone是我们将与 LangChain 结合使用的 Vector Store。有了这些,确保将 OpenAI、Pinecone Environment 和 Pinecone API 的 API 密钥存储到环境文件中。您将能够在他们各自的网站上找到此信息。然后我们只需使用以下内容加载该环境文件:

 # Load environment variables
 ​
 from dotenv import load_dotenv,find_dotenv
 load_dotenv(find_dotenv())

现在,我们准备开始了!

模型(LLM 包装器)

为了与我们的 LLM 交互,我们将为 OpenAI 的 GPT 模型实例化一个包装器。在这种情况下,我们将使用 OpenAI 的 GPT-3.5-turbo,因为它最具成本效益。但是,如果您可以访问,请随意使用更强大的 GPT4。

要导入这些,我们可以使用以下代码:

 # import schema for chat messages and ChatOpenAI in order to query chatmodels GPT-3.5-turbo or GPT-4
 ​
 from langchain.schema import (
     AIMessage,
     HumanMessage,
     SystemMessage
 )
 from langchain.chat_models import ChatOpenAI
     
 ​
 chat = ChatOpenAI(model_name="gpt-3.5-turbo",temperature=0.3)
 messages = [
     SystemMessage(content="You are an expert data scientist"),
     HumanMessage(content="Write a Python script that trains a neural network on simulated data ")
 ]
 response=chat(messages)
 ​
 print(response.content,end='\n')
     

本质上,SystemMessage 为 GPT-3.5-turbo 模块提供上下文,它将为每个提示完成对引用该模块。HumanMessage 指的是您将在 ChatGPT 界面中键入的内容——您的提示。

但是使用自定义知识聊天机器人,我们通常会抽象出提示中重复的部分。例如,如果我正在创建一个推文生成器应用程序,我不想一直输入“给我写一条关于...的推文”。其实AI写作工具就是这么简单开发出来的!

因此,让我们看看如何使用提示模板将其抽象出来。

提示

LangChain 提供 PromptTemplates,允许您根据用户输入动态更改提示,类似于正则表达式的使用方式。

 # Import prompt and define PromptTemplate
 ​
 from langchain import PromptTemplate
 ​
 template = """
 You are an expert data scientist with an expertise in building deep learning models.
 Explain the concept of {concept} in a couple of lines
 """
 ​
 prompt = PromptTemplate(
     input_variables=["concept"],
     template=template,
 )
     
 ​
 # Run LLM with PromptTemplate
 ​
 llm(prompt.format(concept="autoencoder"))
 llm(prompt.format(concept="regularization"))

您可以以不同的方式改变这些以适应您的用例。如果您熟悉使用 ChatGPT,这对您来说应该很舒服。

链条

Chains 允许您使用简单的 PromptTemplates 并在它们之上构建功能。本质上,链就像复合函数,允许您将 PromptTemplates 和 LLM 集成在一起。

使用前面的包装器和 PromptTemplates,我们可以使用采用 PromptTemplate 并将其与 LLM 组合的单个链运行相同的提示:

 # Import LLMChain and define chain with language model and prompt as arguments.
 ​
 from langchain.chains import LLMChain
 chain = LLMChain(llm=llm, prompt=prompt)
 ​
 # Run the chain only specifying the input variable.
 print(chain.run("autoencoder"))
     

最重要的是,顾名思义,我们可以将它们链接在一起以创建更大的组合。

例如,我可以从一个链中获取结果并将其传递到另一个链中。在这个片段中,Rabbitmetrics 从第一个链中获取完成并将其传递到第二个链中以向 5 岁的孩子解释它。

然后,您可以将这些链组合成一个更大的链并运行它。

 # Define a second prompt 
 ​
 second_prompt = PromptTemplate(
     input_variables=["ml_concept"],
     template="Turn the concept description of {ml_concept} and explain it to me like I'm five in 500 words",
 )
 chain_two = LLMChain(llm=llm, prompt=second_prompt)
 ​
 # Define a sequential chain using the two chains above: the second chain takes the output of the first chain as input
 ​
 from langchain.chains import SimpleSequentialChain
 overall_chain = SimpleSequentialChain(chains=[chain, chain_two], verbose=True)
 ​
 # Run the chain specifying only the input variable for the first chain.
 explanation = overall_chain.run("autoencoder")
 print(explanation)

使用链,您可以创建大量功能,这就是 LangChain 如此多才多艺的原因。但它真正出色的地方在于将它与前面讨论的 Vector Store 结合使用。让我们介绍一下那个组件。

嵌入和向量存储

这是我们合并 LangChain 的自定义数据方面的地方。如前所述,嵌入和向量存储背后的想法是将大数据分成块并存储那些在相关时要查询的数据。

LangChain 有一个文本拆分器功能可以做到这一点:

 # Import utility for splitting up texts and split up the explanation given above into document chunks
 ​
 from langchain.text_splitter import RecursiveCharacterTextSplitter
 ​
 text_splitter = RecursiveCharacterTextSplitter(
     chunk_size = 100,
     chunk_overlap = 0,
 )
 ​
 texts = text_splitter.create_documents([explanation])

拆分文本需要两个参数:一个块有多大(chunk_size)和每个块重叠多少(chunk_overlap)。每个块之间有重叠对于帮助识别相关的相邻块很重要。

这些块中的每一个都可以这样检索:

 texts[0].page_content

在我们有了这些块之后,我们需要将它们变成嵌入。这允许 Vector Store 在查询时查找并返回每个块。我们将使用 OpenAI 的嵌入模型来执行此操作。

 # Import and instantiate OpenAI embeddings
 ​
 from langchain.embeddings import OpenAIEmbeddings
 ​
 embeddings = OpenAIEmbeddings(model_name="ada")
     
 ​
 # Turn the first text chunk into a vector with the embedding
 ​
 query_result = embeddings.embed_query(texts[0].page_content)
 print(query_result)

最后,我们需要有一个地方来存储这些矢量化嵌入。如前所述,我们将为此使用 Pinecone。使用前面环境文件中的 API 密钥,我们可以初始化 Pinecone 来存储我们的嵌入。

 # Import and initialize Pinecone client
 ​
 import os
 import pinecone
 from langchain.vectorstores import Pinecone
 ​
 ​
 pinecone.init(
     api_key=os.getenv('PINECONE_API_KEY'),  
     environment=os.getenv('PINECONE_ENV')  
 )
     
 ​
 # Upload vectors to Pinecone
 ​
 index_name = "langchain-quickstart"
 search = Pinecone.from_documents(texts, embeddings, index_name=index_name)
     
 ​
 # Do a simple vector similarity search
 ​
 query = "What is magical about an autoencoder?"
 result = search.similarity_search(query)
 ​
 print(result)

现在我们可以在我们的松果矢量商店查询相关信息了!剩下要做的就是结合我们学到的知识来创建我们的特定用例——为我们提供专门的 AI“代理”。

代理商

代理本质上是一个自主的人工智能,它接受输入并按顺序完成这些输入,直到达到最终目标。这涉及到我们的 AI 使用其他 API 来完成发送电子邮件或做数学题等任务。与我们的 LLM + 提示链结合使用,我们可以将合适的 AI 应用串在一起。

现在,这部分的解释会很广泛,所以这里有一个简单的例子,说明如何在 LangChain 中使用 Python 代理来解决一个简单的数学问题。在这种情况下,该代理通过连接我们的 LLM 来运行 Python 代码并使用 NumPy 找到根源来解决问题:

 # Import Python REPL tool and instantiate Python agent
 ​
 from langchain.agents.agent_toolkits import create_python_agent
 from langchain.tools.python.tool import PythonREPLTool
 from langchain.python import PythonREPL
 from langchain.llms.openai import OpenAI
 ​
 agent_executor = create_python_agent(
     llm=OpenAI(temperature=0, max_tokens=1000),
     tool=PythonREPLTool(),
     verbose=True
 )
     
 ​
 # Execute the Python agent
 ​
 agent_executor.run("Find the roots (zeros) if the quadratic function 3 * x**2 + 2*x -1")

自定义知识聊天机器人本质上是一个代理,它将查询向量化存储的提示和操作链接在一起,获取结果,并将其与原始问题链接起来!

如果您想阅读更多有关 AI 代理的信息,这是一个很好的资源。

其他变化

即使您对 LangChain 的功能有了新的基本了解,我相信此时您的想法还在冒泡。

但到目前为止,我们只看过一个 OpenAI 模型,那就是基于文本的 GPT-3.5-turbo。OpenAI 有一系列模型,您可以将它们与 LangChain 一起使用——包括使用 Dall-E 生成图像。应用我们讨论过的相同概念,我们可以创建AI Art Generator代理、Website Builder 代理等等。

花点时间探索 AI 领域,我相信您会开始获得越来越多的想法。

结论

我希望您对所有这些新 AI 工具的幕后工作有了更多的了解。了解 LangChain 的工作原理是当今作为程序员的一项宝贵技能,可以为您的 AI 开发开辟可能性。

(人工智能教程:https://www.java567.com/search.html?sWord=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&v=2306035

标签:教程,chain,自定义,AI,LangChain,langchain,LLM,import
From: https://www.cnblogs.com/web-666/p/17453333.html

相关文章

  • odoo14 使用ir.actions.client 自定义弹窗内容
    ir.actions.client介绍ir.actions.client是odooactions事件的一种,触发一个在客户端实现(即js文件中定义的函数,通过core.action_registry.add(tag,函数名)注册到odoo中)动作tag--action在客户端的标识符,一般是一个专用的字符串,在js文件中注册该动作时指定。params(可......
  • 处理 Ionic 5 中的重大变化:删除了Events,如何在ionic 5+版本中实现自定义Events用于旧
    您是否将您的Ionic应用程序升级到v5,而您的应用程序正在使用Events,它不再工作?如果上述情况属实,那么您来对地方了。先讲个小故事——几天前,我看到一条来自离子团队的推文,Ionic5已发布,在看到该推文10分钟后,我仅使用两个命令将我们的一个中型生产应用程序升级到Ionic5和A......
  • 项目_使用docker部署前端教程
    dist文件夹直接替换systemctlrestartdockersudodockerps-asudodockerrestart<ContainerId> 问题1:docker端口映射或启动容器时报错 Errorresponsefromdaemon:driverfailedprogrammingexternalconnectivityonendpoint解决方法:https://blog.csdn.net/what......
  • 2015.4.24.17.36_pencil_2015.4.24_Pencil教程=自定义组件安装_0.01
    在前面《原型工具Pencil使用介绍》中有说到Pencil支持自定义组件安装,也简易的介绍了安装使用方法,这里再详细的介绍一下如何安装自定义组件。在最新版本的Pencil1.3中,自带的组件库是比较少的,只有三个,但在Pencil1.2版本中自带的组件库有七个,而且1.3个人感觉只是界面布局上的更新,操......
  • 2015.4.28_正则表达式_正则表达式简易教程
    为什么使用正则表达式通过正则表达式,可以:测试字符串内的模式。例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。替换文本。可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。基于模式匹配从字符串中提......
  • 零声学院 音视频高级教程 ubuntu16.04 ffmpeg开发环境搭建
    配置环境ubuntudesktop16.04+ffmpeg4.2.1建议在《编译与安装》一节,都使用源码的方式编译和安装,本编译安装方式最终生成的皆为静态库。部分命令说明:git-C[git-command]指定其它路径的仓库执行命令注意,-C要在命令之前创建目录在home目录下创建ffmpeg_sources:用于下载源文......
  • iOS应用上架详细图文教程
    ​ AppStore作为苹果官方的应用商店,审核严格周期长一直让用户头疼不已,很多app都“死”在了审核这一关,那我们就要放弃iOS用户了吗?当然不是!本期我们从iOSapp上架流程开始梳理,详细了解下iOSapp上架的那些事。 iOSapp上架总体流程: ​编辑1登录苹果开发者中心,注册开发......
  • iOS应用上架详细图文教程
    ​ AppStore作为苹果官方的应用商店,审核严格周期长一直让用户头疼不已,很多app都“死”在了审核这一关,那我们就要放弃iOS用户了吗?当然不是!本期我们从iOSapp上架流程开始梳理,详细了解下iOSapp上架的那些事。 iOSapp上架总体流程: ​编辑1登录苹果开发者中心,注册开发......
  • 软件测试|web自动化测试神器playwright教程(十一)
    前言在我们进行web自动化测试的过程中,我们经常会面临需要登录的情况,每一次打开页面如果都需要重新登录的话,就会大大增加测试所需要的时间,体现不出自动化测试的优势,我们都知道selenium可以通过cookie实现登录,那么playwright能不能实现这个功能呢?答案是肯定的,playwright可以实现保存c......
  • Angular Google Charts教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介GoogleCharts是一个纯粹的基于JavaScript的图表库,旨在通过添加交互式图表功能来增强Web应用程序.它支持各种图表.在Chrome,Firefox,Safari,InternetExplorer(IE)等标准浏览器中使用SVG绘制图表.在传统的IE6中,VML用于绘制图形.AngularGoogleCharts是一个基于开源角度......