LangChain神器:只需五步,就能构建自定义知识聊天机器人

前言

你可能听说过,最近几个月出现了很多人工智能的应用程序。你可能也在用一些这样的应用。

比如ChatPDFCustomGPTAI这些AI工具,它们可以帮我们省去很多麻烦,我们不用再翻来覆去地看文档,就能找到想要的答案。它们让AI为我们做了很多工作。

那么,开发这些工具的人是怎么做到的呢?其实,他们都用了一个叫LangChain的开源框架。

在这篇文章里,我会告诉你LangChain是什么,以及它是怎么和OpenAI的API一起工作的,来创建这些很厉害的工具。同时,希望通过文本的介绍能给你带来一些灵感,让你也想出自己的创意。OK,我们开始吧!


一、LangChain介绍?

LangChain是一个开源的框架,它可以让AI开发人员把像GPT-4这样的大型语言模型(LLM)和外部数据结合起来。它提供了Python或JavaScript(TypeScript)的包。

你可能知道,GPT模型是用到2021年的数据训练的,这可能会有很大的局限性。虽然这些模型的通用知识很棒,但是如果能让它们连接到自定义的数据和计算,就会有更多的可能性。这就是LangChain做的事情。

简单来说,它可以让你的LLM在回答问题时参考整个数据库。所以你现在可以让你的GPT模型访问最新的数据,比如报告、文档和网站信息。

最近,LangChain 的人气大幅飙升,特别是在三月份GPT-4发布之后。这要归功于它的功能特性和它与强大的LLM搭配时带来的无限可能性。


二、LangChain工作原理?

你可能觉得LangChain听起来很复杂,但其实它很容易上手。

简单来说,LangChain就是把大量的数据组合起来,让LLM能够尽可能少地消耗计算力就能轻松地引用。它的工作原理是把一个大的数据源,比如一个50页的PDF文件,分成一块一块的,然后把它们嵌入到一个向量存储(Vector Store)里。

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

现在我们有了大文档的向量化表示,我们就可以用它和LLM一起工作,只检索我们需要引用的信息,来创建一个提示-完成(prompt-completion)对。

当我们把一个提示输入到我们新的聊天机器人里,LangChain就会在向量存储里查询相关的信息。你可以把它想象成一个专门为你的文档服务的小型谷歌。一旦找到了相关的信息,我们就用它和提示一起喂给LLM,生成我们的答案。

LangChain 如何与 OpenAI 的 LLM 合作

LangChain还可以让你创建一些可以执行动作的应用程序,比如上网、发邮件、完成其他API相关的任务。你可以看看AgentGPT,这是一个很好的例子。

这样的应用程序有很多可能的用途,这里只是我随便想到的一些:

  • 个人AI邮件助手

  • AI学习伙伴

  • AI数据分析

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

  • 社交媒体内容创作助手

这样的案例还有更多。我会在以后的文章里介绍具体的构建教程,敬请期待。


三、LangChain应用实战

一个LangChain应用程序由5个主要部分组成:

  1. 模型(LLM包装器)

  2. 提示

  3. 嵌入和向量存储

  4. 代理

我会给你分别来介绍每个部分,让你能够对LangChain的工作原理有一个高层次的理解。接下来,你应该能够运用这些概念,开始设计你自己的用例和创建你自己的应用程序。

接下来我会用Rabbitmetrics(Github)的一些简短的代码片段来进行介绍。他提供了有

关此主题的精彩教程。这些代码片段应该能让你准备好使用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环境和Pinecone API的API密钥存储到你的环境配置文件里。

你可以在它们各自的网站上找到这些信息。然后我们就用下面的代码来加载那个环境文件:

现在,我们准备好开始了!



# 加载环境变量  
  
from dotenv import load\_dotenv,find\_dotenv  
load\_dotenv(find\_dotenv())


3.1、模型(LLM包装器)



为了和我们的LLM交互,我们要实例化一个OpenAI的GPT模型的包装器。在这里,我们要

用OpenAI的GPT-3.5-turbo,因为它是最划算的。但是如果你有权限,你可以随意使用更

强大的GPT4。

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




# 为了查询聊天模型GPT-3.5-turbo或GPT-4,导入聊天消息和ChatOpenAI的模式(schema)。  
  
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="你是一个专业的数据科学家"),  
    HumanMessage(content="写一个Python脚本,用模拟数据训练一个神经网络")  
\]  
response=chat(messages)  
  
print(response.content,end='\\n')




实际上,SystemMessage为GPT-3.5-turbo模块提供了每

个提示-完成对的上下文信息。HumanMessage是指您在Chat

GPT界面中输入的内容,也就是您的提示。

但是对于一个自定义知识的聊天机器人,我们通常会将提示中

重复的部分抽象出来。例如,如果我要创建一个推特生成器应

用程序,我不想一直输入“给我写一条关于…的推特”。因此,让

我们来看看如何使用提示模板(PromptTemplates)来将这些

内容抽象出来。




  

3.2、提示

![](https://mmbiz.qpic.cn/mmbiz_png/jfqzGzGng31wPrlkGcxq3EAk5gibhMOe9Opddmq5IbTqenuJyiaYyTAK3RSSyPh9lIgsrG0weLBCib9NZZSfsHXDA/640?wx_fmt=png)

  

  

LangChain提供了PromptTemplates,允许你可以根据用户输入动态地更改提示,类

似于正则表达式(regex)的用法。




# 导入提示并定义PromptTemplate  
  
from langchain import PromptTemplate  
  
template = """  
您是一位专业的数据科学家,擅长构建深度学习模型。  
用几行话解释{concept}的概念  
"""  
  
prompt = PromptTemplate(  
    input\_variables=\["concept"\],  
    template=template,  
)  
  
# 用PromptTemplate运行LLM  
llm(prompt.format(concept="autoencoder"))  
llm(prompt.format(concept="regularization"))


你可以用不同的方式来改变这些提示模板,让它们适合你的应用场景。如果你熟练使

用ChatGPT,这应该对你来说很简单。



  



3.3、链



链可以让你在简单的提示模板上面构建功能。本质上,链就像复合函数,让你可以把你

的提示模板和LLM结合起来。

使用之前的包装器和提示模板,我们可以用一个单一的链来运行相同的提示,它接受一

个提示模板,并把它和一个LLM组合起来:




# 导入LLMChain并定义一个链,用语言模型和提示作为参数。  
  
from langchain.chains import LLMChain  
chain = LLMChain(llm=llm, prompt=prompt)  
  
# 只指定输入变量来运行链。  
print(chain.run("autoencoder"))




除此之外,顾名思义,我们还可以把这些链连起来,创建更大的组合。  

比如,我可以把一个链的结果传递给另一个链。在这个代码片段里,Rabbitmetrics

把第一个链的完成结果传递给第二个链,让它用500字向一个五岁的孩子解释。

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




# 定义一个第二个提示  
  
second\_prompt = PromptTemplate(  
    input\_variables=\["ml\_concept"\],  
    template="把{ml\_concept}的概念描述转换成用500字向我解释,就像我是一个五岁的孩子一样",  
)  
chain\_two = LLMChain(llm=llm, prompt=second\_prompt)  
  
# 用上面的两个链定义一个顺序链:第二个链把第一个链的输出作为输入  
  
from langchain.chains import SimpleSequentialChain  
overall\_chain = SimpleSequentialChain(chains=\[chain, chain\_two\], verbose=True)  
  
# 只指定第一个链的输入变量来运行链。  
explanation = overall\_chain.run("autoencoder")  
print(explanation)


有了链,你可以创建很多功能,这就是LangChain功能强大的原因。但是它真正发挥作用的地方是和前面提到的向量存储一起使用。接下来我们开始介绍一下这个部分。



  



3.4、嵌入和向量存储



这里我们将结合LangChain进行自定义数据存储。如前所述,嵌入和向量存储的思想是

把大数据分成小块,并存储起来。

LangChain有一个文本分割函数来做这个:




# 导入分割文本的工具,并把上面给出的解释分成文档块  
  
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


在我们有了这些块之后,我们需要把它们变成嵌入。这样向量存储就能在查询时找到并返回每个块。我们将使用OpenAI的嵌入模型来做这个。



# 导入并实例化 OpenAI embeddings  
  
from langchain.embeddings import OpenAIEmbeddings  
  
embeddings = OpenAIEmbeddings(model\_name="ada")  
       
  
# 用嵌入把第一个文本块变成一个向量  
  
query\_result = embeddings.embed\_query(texts\[0\].page\_content)  
print(query\_result)


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



# 导入并初始化Pinecone客户端  
import os  
import pinecone  
from langchain.vectorstores import Pinecone  
  
pinecone.init(  
    api\_key=os.getenv('PINECONE\_API\_KEY'),    
    environment=os.getenv('PINECONE\_ENV')    
)  
       
# 上传向量到Pinecone  
index\_name = "langchain-quickstart"  
search = Pinecone.from\_documents(texts, embeddings, index\_name=index\_name)  
       
# 做一个简单的向量相似度搜索  
query = "自动编码器有什么神奇之处?"  
result = search.similarity\_search(query)  
  
print(result)




现在我们能够从我们的Pinecone向量存储里查询相关的信息了!剩下要做的就是把我们

学到的东西结合起来,创建我们特定的用例,给我们一个专门的AI“代理”。

  



3.5、代理



  

一个智能代理就是一个能够自主行动的AI,它可以根据输入,依次完成一系列的任务,直

到达成最终的目标。这就意味着我们的AI可以利用其他的API,来实现一些功能,比如发

送邮件或做数学题。如果我们再加上我们的LLM+提示链,我们就可以打造出一个适合我们

需求的AI应用程序。

这部分的原理可能有点复杂,所以让我们来看一个简单的例子,来演示如何用LangChain中

的一个Python代理来解决一个简单的数学问题。这个代理是通过调用我们的LLM来执行

Python代码,并用NumPy来求解方程的根:

  





# 导入Python REPL工具并实例化Python代理  
  
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  
)  
       
# 执行Python代理  
  
agent\_executor.run("找到二次函数3 \* x \*\* 2 + 2 \* x - 1的根(零点)。")


一个定制知识的聊天机器人,其实就是一个能够把问题和动作串起来的智能代理。它会把问题发送给向量化存储,然后把得到的结果和原来的问题结合起来,给出答案!


四、其他变化

你已经初步了解了LangChain的神奇功能,是不是心里已经跃跃欲试,想要亲自动手试试呢?

不过,你可能还不知道,我们现在介绍的只是OpenAI的一个模型,就是能够处理文本的GPT-3.5-turbo。其实,OpenAI还有很多其他的模型,它们都可以和LangChain搭配使用——比如用Dall-E来创造出各种各样的图像。只要运用我们刚才讲过的原理,你就可以轻松打造出AI图片生成器、网站构建器等等。

AI的世界有无限的可能性等着你去发现,赶快去探索吧,我相信你一定会有更多的灵感和创意。

五、结论

看完这篇文章,你是不是对这些新AI工具的原理有了更深的了解呢?掌握LangChain的运作方式,对于程序员来说是一项非常重要的技能,它可以让你的AI开发更加高效和创新。

那么,如何系统的去学习大模型LLM?

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

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~

篇幅有限,部分资料如下:

👉LLM大模型学习指南+路线汇总👈

💥大模型入门要点,扫盲必看!
在这里插入图片描述
💥既然要系统的学习大模型,那么学习路线是必不可少的,这份路线能帮助你快速梳理知识,形成自己的体系。
在这里插入图片描述

👉大模型入门实战训练👈

💥光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

👉国内企业大模型落地应用案例👈

💥《中国大模型落地应用案例集》 收录了52个优秀的大模型落地应用案例,这些案例覆盖了金融、医疗、教育、交通、制造等众多领域,无论是对于大模型技术的研究者,还是对于希望了解大模型技术在实际业务中如何应用的业内人士,都具有很高的参考价值。 (文末领取)
在这里插入图片描述
💥《2024大模型行业应用十大典范案例集》 汇集了文化、医药、IT、钢铁、航空、企业服务等行业在大模型应用领域的典范案例。

在这里插入图片描述

👉LLM大模型学习视频👈

💥观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。 (文末领取)
在这里插入图片描述

👉640份大模型行业报告👈

💥包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
在这里插入图片描述

👉获取方式:

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

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值