LangChain 是一个用于开发由语言模型驱动的应用程序的框架。它使得应用程序能够:
-
具有上下文感知能力:将语言模型连接到上下文来源(提示指令,少量的示例,需要回应的内容等)
-
具有推理能力:依赖语言模型进行推理(根据提供的上下文如何回答,采取什么行动等)
在我们以往使用大模型的时候,往往是比较单一的,一般都是直白的你问我答的形式,Langchain的出现是在你问大模型答的时候做若干处铺垫,使得大模型回答的更好。把使用大模型比喻成和老虎搏斗,以前的你赤手空拳跟老虎搏斗,Langchain的作用就是现在和老虎搏斗,你可以选择趁手合适的道具,看我一个滑铲(bushi)。
这个框架由几个部分组成。
- LangChain 库:Python 和 JavaScript 库。包含了各种组件的接口和集成,一个基本的运行时,用于将这些组件组合成链和代理,以及现成的链和代理的实现。
langchain-core
: 基础抽象和 LangChain 表达式。langchain-community
: 第三方集成- 像本教程所用的百度千帆大模型就是例子
- Langchain模板:一系列易于部署的参考架构,用于各种任务。
- LangServe:一个用于将 LangChain 链部署为 REST API 的库。
- LangSmith:一个开发者平台,让你可以调试、测试、评估和监控基于任何 LLM 框架构建的链,并且与 LangChain 无缝集成。
- 下面是langchain结构图:
上面说了这么多,听起来是云里雾里,聪明的你只需谨记一点:框架的作用在于有丰富的工具去处理一件事,使得这件事可以规范化、流程化、多样化。
开启新世界大门的第一步,安装所需环境:
安装环境
pip install langchain
pip install qianfan
pip install langchain_community
本教程所用大模型,因为要照顾不能科学冲浪的伙伴,所用大模型均是百度千帆大模型,我们只需了解大模型在langchain扮演的角色即可,实际应用的时候,自己可选择合适的模型!!!
聪明的你应该,注册一个百度千帆开发者账号,然后在左侧应用栏开通应用,然后创建应用,再然后开通付费。
我假设聪明的你已经完成了上面一系列流程,下面进入正题:
初探Langchain
import os
from langchain_community.llms import QianfanLLMEndpoint
# 设置API
os.environ["QIANFAN_AK"] = ""
os.environ["QIANFAN_SK"] = ""
# 实例化
llm = QianfanLLMEndpoint()
res = llm("刻舟求剑的故事说明了什么")
print(res)
---------------------------------------------------------------
“刻舟求剑”是一则典型的寓言故事,其含义在于表明一些人在对待事情的态度和行为方式上的刻板、僵硬、墨守成规。它表达了一些重要观点和人生道理,包括以下几点:
1. 世界在不断变化,应该适应现实世界,而不能仅靠刻板成见来处理问题。
2. 事物的变化和发展是客观存在的,不能以静止的眼光看待问题。
3. 人的思维方式和行为方式应该具有灵活性,不能一成不变。
通过上面寥寥几行代码,聪明的你就完成了第一次Langchain的使用,是不是很简单,当我们要去做一件复杂的事情的时候,我们应该先从简单的事情着手!
由上面代码可以知道,我们是通过langchain-community
调的第三方的大模型完成的langchain构建,而前面设置是百度千帆的密钥,具体可见其网站的开发文档。
Langchain 百度千帆文档链接
langchain基本结构
LangChain应用程序的核心构建模块是LLMChain。它结合了三个方面:
LLM
: 语言模型是核心推理引擎。要使用LangChain,您需要了解不同类型的语言模型以及如何使用它们。
Prompt Templates
: 提示词。这控制了语言模型的输出,因此了解如何构建提示和不同的提示策略至关重要。
Output Parsers
: 将LLM的原始响应转换为更易处理的格式,使得在下游使用输出变得容易。
LLM
LangChain中有两种类型的语言模型,称为:
LLMs
: 这是一个以字符串作为输入并返回字符串的语言模型
ChatModels
: 这是一个以消息列表作为输入并返回消息的语言模型
LLMs的输入/输出简单易懂 - 字符串。但是ChatModels呢?那里的输入是一个ChatMessage列表,输出是一个单独的ChatMessage。 一个ChatMessage具有两个必需的组件:
content
: 这是消息的内容。
role:
这是ChatMessage来自的实体的角色。
LangChain提供了几个对象,用于方便地区分不同的角色:
HumanMessage
: 来自人类/用户的ChatMessage。
AIMessage
: 来自AI/助手的ChatMessage。
SystemMessage
: 来自系统的ChatMessage。
FunctionMessage
: 来自函数调用的ChatMessage。
下面是一个 HumanMessage
simple:
import os
from langchain_community.chat_models import QianfanChatEndpoint
from langchain_core.messages import HumanMessage
# 设置API
os.environ["QIANFAN_AK"] = ""
os.environ["QIANFAN_SK"] = ""
chat = QianfanChatEndpoint(model="ERNIE-Bot-turbo")
messags = [
HumanMessage(content="刻舟求剑求的真的是🗡吗")
]
res = chat(messags)
print(res)
-----------------------------------
content='**刻舟求剑求的并不是剑,而是剑掉进水里时,船工在船上刻下记号,希望通过寻找刻下的记号找到剑**。这里的“求”是寻找的意思。'
additional_kwargs={'finish_reason': '', 'request_id': 'as-1rmgewhain', 'object': 'chat.completion', 'search_info': []}
response_metadata={'token_usage': {'prompt_tokens': 12, 'completion_tokens': 46, 'total_tokens': 58}, 'model_name': 'ERNIE-Bot-turbo', 'finish_reason': 'stop', 'id': 'as-1rmgewhain', 'object': 'chat.completion', 'created': 1724056784, 'result': '**刻舟求剑求的并不是剑,而是剑掉进水里时,船工在船上刻下记号,希望通过寻找刻下的记号找到剑**。这里的“求”是寻找的意思。', 'is_truncated': False, 'need_clear_history': False, 'usage': {'prompt_tokens': 12, 'completion_tokens': 46, 'total_tokens': 58}} id='run-61243e44-03f4-4529-a1e4-607b0457a93c-0' usage_metadata={'input_tokens': 12, 'output_tokens': 46, 'total_tokens': 58}
Prompt Templates
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
import os
from langchain_community.llms import QianfanLLMEndpoint
# 设置API
os.environ["QIANFAN_AK"] = ""
os.environ["QIANFAN_SK"] = ""
# 实例化
llm = QianfanLLMEndpoint()
prompt = PromptTemplate.from_template("给我起一个很土但很好养活的{对象}小名")
chain = LLMChain(llm=llm,prompt=prompt)
chain.run("小狗")
Output Parsers
OutputParsers将LLM的原始输出转换为可以在下游使用的格式。输出解析器有几种主要类型,包括:
将LLM的文本转换为结构化信息(例如JSON)
将ChatMessage转换为字符串
这个没有示例,读者可自行查看文档。
以上我们完成了第一步,千里之行始于足下,后面我们将继续这一段旅程。感兴趣的可以关注博主。
Langchain官方文档链接