一.LamgChain是什么
1.基本概念:
LangChain是一个基于大语言模型(LLMs)用于构建端到端语言模型应用的框架。
2.基本组件:
1.模型(Models),包含各大语言模型的LangChain接口和调用细节,以及输出解析机制。
2.提示模板(Prompts),使提示工程流线化,进一步激发大语言模型的潜力。
3.数据检索(Indexes),构建并操作文档的方法,接受用户的查询并返回最相关的文档,轻松搭建本地知识库。
4.记忆(Memory),通过短时记忆和长时记忆,在对话过程中存储和检索数据,让ChatBot记住你是谁。
5.链(Chains),是LangChain中的核心机制,以特定方式封装各种功能,并通过一系列的组合,自动而灵活地完成常见用例。
6.代理(Agents),是另一个LangChain中的核心机制,通过“代理”让大模型自主调用外部工具和内部工具。
二.基础代码
前言:本文更加注重基础代码的理解,无论是否学过python等等知识,希望在看完本篇文章后可以有一个基本的认知。其实不了解代码的部分原因可能是不清楚单词的意思,所以经常向豆包提问,或许你就会恍然大悟了。
1.对于代码中出现的一些英文,以下是几个例子,或许你看过后能有一个更深刻的理解:
1.llm
:large language model,即大语言模型
2.os
:operating system,即操作系统
3.environ
:environment,即环境
4.API
:Application Programming Interface,即应用程序接口
5.URL
:Uniform Resource Locator,即统一资源定位符
6.Ark
:方舟
2.常用代码
1.import os
:用于导入 Python 的标准库模块 os
2.from OpenAI import ChatOpenAI
:导入ChatOpenAI类(text模型调用OpenAI即可)
3.from langchain_openai import ChatOpenAI
:通过langchain调用OpenAI
4.os.environ[]
:给环境中的变量赋值,例如os.environ[OPEN_API_KEY]='abcdefg'
5.os.environ.get()
:访问环境变量,例如os.environ.get("OPENAI_API_KEY")
可以用来访问搭建环境中的AI的KEY
6.llm=ChatOpenAI()
:初始化大语言模型
7.llm.predict/invoke()
:使用predict/invoke方法输出结果
3.常见参数
1.model
:模型
2.max_tokens
:输出的最大长度(以Tokens为单位)
3.temperatrue
:随机性,值越大随机性越大,输出结果越不同
4.OPENAI_API_KEY
:OpenAI_接口_密钥
5.OPENAI_BASE_URL
:OpenAI_Url地址
6.prompt
:text模型输入提示词
7.messages
:chat模型输入中的消息,每个消息包含role(可以是system、user或assistant)和content
8.response
:模型的输出响应
三.基础应用
注意:1.本文将使用两种大语言模型:Chat Model和Text Model,两种模型使用方式有所区别。2.本文调用模型方式分为直接调用和通过LangChain调用。具体内容看后文。
1.环境配置(/home/cloudide/.cloudiderc)
此处信息均可到火山引擎中获取,并且配置了环境后在代码中无需再获取
export OPENAI_API_KEY=****************************
export OPENAI_BASE_URL="https://ark.cn-beijing.volces.com/api/v3"
export LLM_MODELEND=ep-**********************************
export EMBEDDING_MODELEND=ep-**************************
2.实战一.给花店起名(直接调用Chat模型,此处调用ark接口)
注意:文章中接口废弃,改用火山引擎中的接口,源自这位大佬的解决方法。
从最开始的接入OpenAI(或其它大模型)接口,到构建自己所需的client客户端,并填充最基本的参数:模型,temperatrue,max_tokens,prompt/messages等等,最后再输出结果,这一过程还是清晰明了的。
import os
from volcenginesdkarkruntime import ark # 具体使用请到火山引擎模型API调用下方代码处学习
# 创建Ark客户端
client=Ark()
# 调用chat接口的completions.create方法生成文本
response=client.chat.completions.create(
model=os.get(LLM_MOODLEND),
temperature=0.5,
max_tokens=400,
messages=[
{"role":"system","content":"You are a creative AI."}
{"role":"user","content":"请给我的花店取个名"}
]
)
print(response.choices[0].message.content.strip())
为了引入两种模型差异,下面给出text模型代码
与chat模型相比在代码上没有本质性的区别。
import os
from openai import OpenAI
client=OpenAI()
response=client.completions.create(
model=os.get(LLM_MOODLEND),
temperature=0.5,
max_tokens=400,
prompt="请给我的花店取个名"
)
print(response.choices[0].text.strip())
含义:
其中choices
字段是一个列表,因为在某些情况下,你可以要求模型生成多个可能的输出。每个选择都是一个字典,其中包含以下字段:
1.text
:模型生成的文本。
2.finish_reason
:模型停止生成的原因,可能的值包括 stop(遇到了停止标记)、length(达到了最大长度)或 temperature(根据设定的温度参数决定停止)。
所以最后print(response.choices[0].text.strip())
的具体含义为:从响应中获取第一个(如果在调用大模型时,没有指定n参数,那么就只有唯一的一个响应)选择,然后获取该选择的文本,并移除其前后的空白字符。
模型差异:
1.chat模型的completions.create
方法前需要添加一个chat。
2.text模型中使用prompt
输入问题,而chat模型中使用messages
列表。
3.text模型print函数中使用.text
,而chat模型print函数中使用.message.content
。
3.实战二.情人节玫瑰花宣传语(通过LangChain调用text和chat模型)
若是你已经完全理解了上面的代码,这道实战理解起来还是很轻松的。
text模型
从代码量上就能看出LangChain调用模型的便捷性,直接利用OpenAI接口生成模型llm并输出。
import os
from langchian_openai import OpenAI
# langchain库对API调用进行了一定的封装,获取模型的生成结构更加便捷
llm = OpenAI(
model=os.environ.get[LLM_MOODLEND],
temperature=0.8,
max_tokens=60
)
response=llm.predict("写几条情人节玫瑰花宣传语")
print(response)
chat模型
比text模型多调用了LangChain中的两种Message,比直接调用模型中messages的构建更加清晰规范。
import os
from langchain.openai import ChatOpenAI
from langchain.schema import (
HumanMessage,
SystemMessage
)
chat = ChatOpenAI(
model=os.environ.get[LLM_MOODLEND],
temperature=0.8,
max_tokens=60
)
messages = [
SystemMessage(content="你是一个很棒的智能助手"),
HumanMessage(content="写几条情人节玫瑰花宣传语")
]
response = chat(messages)
print(response)
调用模型方式的差异(text/chat)
1.直接调用为from openai import OpenAI
(包括Text和Chat模型),通过LangChain调用为from langchain_ai import OpenAI(Text模型)/ChatOpenAI(Chat模型)
。
2.直接调用为client=OpenAI()
,通过LangChain调用模型为llm/chat=OpenAI/ChatOpenAI(模型参数)
。
3.直接调用为
response=client.chat.completions.create
print(response.choices[0].text/(message.content).strip())
通过LangChain调用为
response=llm.predict(问题)/chat(messages)
print(response)