LangChain基础入门[1]

2023-11-17 16:40:40 浏览数 (1)

环境准备

  • Python环境(编写当前文章时使用的3.10.11)
  • VS Code

注意:

LangChain官网要求最低版本3.8.1

安装Jupyter Notebook

安装之前确认一下python 版本:python --version

介绍

可自行百度、Google

安装

代码语言:javascript复制
pip install jupyterlab

验证(直接运行)

代码语言:javascript复制
jupyter-lab

地址:http://localhost:8888/lab

如图

image.png

至此完成了jupyterlab的安装。安装完成后,我们便可以在VS Code上进行配置使用,VS Code 的安装自行百度、Google。

VS Code配置Jupyter

安装

首先要在VS Code上安装Jupyter插件,如图:

测试(Hello World)

打开VS Code的控制台(TERMINAL),执行创建一个测试文件命令:code test-jupyter.ipynb 。如图:

在文件中添加以下代码块,并点击代码块左侧的三角符号便可执行,执行成功便会在代码块下方出现Hello World 字样。如图:

代码语言:javascript复制
print("Hello World");

image.png

安装LangChain

需要确认好你的python版本!!!

安装命令:

代码语言:javascript复制
pip install langchain

安装成功,如图:

安装dotenv插件

用于加载环境变量

代码语言:javascript复制
pip install python-dotenv

简单应用

使用LLM模块生成文本

第三方模型的API
  • 百度 文心ERNIE
  • 阿里 通义千问
  • Replicate
  • Openai
测试代码

langchain-llm.ipynb 代码如下(自行拷贝到自己文件中):

代码语言:javascript复制
###### 载入环境变量,根据不同的LLM模块,需要的环境变量也是不一样的。



%load_ext dotenv
    %dotenv



from langchain.llms import OpenAI

llm = OpenAI()



llm.predict("给我一个很好听但是比较土的小狗的名字")


环境变量

在上述代码同级目录中创建一个.env文件并将Openai的APIKEY放进去,如下:

代码语言:javascript复制

# 该代码放置在demo同级目录下的.env 文件下(没有则新建一个)
OPENAI_API_KEY="sk-uXXXXXXXXXXXXXXXXX8Hj8u0vNPPDTFxQpO"
层级目录如下:

image.png

完整流程图示

具体演示图如下:

完整文件

langchain-llm.ipynb

报错

如果报错如下图所示:

执行命令即可

代码语言:javascript复制
pip install openai

使用聊天模块创建一个聊天应用

简单的说就是它可以以聊天对话的形式来续写一段对话。它和我们的之前讲到的LM模块是类似的。因为它的底层是以LLM模块作为基础

本次演示会引用三个它的消息类第一个消息类:

  • 用于支持聊天模块的特殊类
    • AIMessage
    • HumanMessage
    • SystemMessage

然后聊天模块支持的方法调用

  • predict_message
  • predict
    • 使用的方式和LLM方式一样
代码:
代码语言:javascript复制
# 方式一:
from langchain.chat_models import ChatOpenAI

chat_model = ChatOpenAI()
chat_model.predict("给我一个很土但是很好听的小狗的名字")


# 方式二:
# 对话方式由 AIMessage包裹,针对于聊条历史记录chat_model更好用一些。
from langchain.schema import HumanMessage
text = "一个专门生产彩虹独角兽的公司应该叫什么名字"
messages = [HumanMessage(content=text)]

chat_model.predict_messages(messages)



# 方式三:
# 对话方式
llm.predict_messages(messages)

如图:

源文件

langchain-llm.ipynb

链式结构

首先其实LangChain中的Chain实际上就是一个链式结构。

概念-什么是链式结构:

就是按照某种需求将其串联起来,变成一条锁链,那么这一条锁链它本身就已经变成了一个应用,当然这条锁链可能会有一个输出是一个字符串,然后一个输入也是一个字符串。

为什么需要链式结构

首先我们刚才说的是需要方便的连接多个LLM模块。但它不一定是LLM模块,它可以是各种不同的模块,LLM模块只是我们刚才讲到的一个最基础的模块

代码:
代码语言:javascript复制
%load_ext dotenv
%dotenv

from langchain.llms import OpenAI

llm = OpenAI()




from langchain.prompts import PromptTemplate
# 提示模板
prompt = PromptTemplate.from_template("给我一个很土但很好听的{对象}小名")


prompt.format(对象= "小狗")




from langchain.chains import LLMChain

chain = LLMChain(llm=llm, prompt=prompt)

# run提供了一个参数。prompt只有一个参数正好是run方法提供的
chain.run("小猫")

如图:

源文件

langchain-llm-chain.ipynb

简单应用代理人

概念-什么是代理人

代理人和之前提到的链式的模块有些不同,它存在的意义在于去解决一些链式模块难以独立处理的复杂问题,例如:解决一些复杂的数学计算、或者是访问互联网去得到一些最新的信息。我们知道大语言模型本省是不支持联网的,或者说大部分是不联网的,从而意味着它里面的数据是有限的。那我们如何使用LangChain如获取最新的结果呢,比如最新的一些新闻。这时候就要通过互联网,而LangChain解决这个问题的办法就是提供了一个代理人模块。

代理人模块可以运用众多的工具从而达到预期的结果。代理人的本质就是我们给定它一个任务,它会运用它内部的语言模型也就是LLM模块来决定这个任务所需要的行为以及实施这些行为的顺序。类似于人的思考过程。

假设要实现这样一个目标我需要有哪些步骤,以及我应该以什么样的顺序去完成这个步骤,在完成步骤的过程中,我能否用我现有的工具来实现我的目标。比方说如果我需要访问互联网:那我有没有访问互联网的工具、比如说我要做数学计算,那么我有没有可以做数学计算的工具,如果有的话他们就会选择使用工具,然后来使用工具之后。最后会处理使用工具得到的结果。然后开始进行下一个步骤的处理,就以此类推实现最终的目标,直至把你给他的任务给完成了。这就是代理人的整个的一个工作流程

案例:
代码语言:javascript复制
# 首先先加载环境变量
%load_ext dotenv
%dotenv


# 初始化语言模型对象
from langchain.llms import OpenAI
llm = OpenAI()


# 加载代理工具对象 llm-math
from langchain.agents import initialize_agent
from langchain.agents import load_tools

tools = load_tools(["llm-math"], llm=llm)




# 初始化代理人
from langchain.agents import AgentType
agent = initialize_agent(
    tools, llm=llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
)


# 它的运算结果不是很准确,只能进行相对比较简单的运算
llm.predict("25的3.5次方是多少?")


agent.run("25的3.5次方是多少?")

# llm和agent虽然都能运算,但是llm只能运算相对比较简单的,就像本次案例llm运行的结果是错误的

如图:

源码

langchain-llm-proxy.ipynb

简单应用-聊天记录

它实际也是一个Chain,但是他着重关注的点是对话,运行方式也很简单,只需要提供一个语言模块即可。然后通过run()方法调用。

案例:

代码语言:javascript复制
# 首先先加载环境变量
%load_ext dotenv
%dotenv


# 初始化语言模型对象
from langchain.llms import OpenAI
llm = OpenAI()



from langchain.chains import ConversationChain
conversation = ConversationChain(llm=llm, verbose=True)
conversation.run("你好呀!")


conversation.run("我今天领养了一只小猫哦!")

conversation.run("暂时还没有,有什么好的建议 ?")

图片:

image.png

源码:langchain-llm-chat.ipynb

如有需要本次demo源码的同学,请访问以下地址自行下载:

https://github.com/codingpaidaxing/langchain/tree/master/notebooks

LangChain相关文档

  • 入门教程

https://python.langchain.com/docs/get_started

  • 集成组件

https://python.langchain.com/docs/integrations/llms

  • API文档

https://api.python.langchain.com/en/latest/api_reference.html

  • 阿里、通义千问

https://python.langchain.com/docs/integrations/llms/tongyi

  • 百度文心

https://js.langchain.com/docs/integrations/chat/baidu_wenxin

  • 分类文档

https://python.langchain.com/docs/modules

LangChain文档截止目前的局限性

  • LangChain的开发速度很快,文档内容经常跟不上(可能你需要去看它的release log)
  • 文档结构的逻辑关系不是十分清晰,需要跳着看(可能需要做笔记然后联系上下文)
  • 文档里面有一些重复出现的示例,影响阅读效率
  • 文档里面的示例有的会在新版中消失,很不方便

源码

https://github.com/langchain-ai/langchain

至此,本次入门的教程到此结束了,感谢你的阅读。希望对你的学习有所帮助

如有问题,欢迎加微信交流:w714771310,备注- 技术交流 。或关注微信公众号【码上遇见你】。


0 人点赞