LangChain 是一个开源框架,它的出现是为了简化和加速大语言模型相关应用的开发,比如开发基于OpenAI的应用,开发基于百度千帆大模型的应用。
那你可能会说,平时我们开发基于大模型的应用或者功能时,比如开发基于OpenAI的的应用时,我们都是直接调用OpenAI的chat接口或者assistants接口,并没有使用LangChain框架和它的接口。是的,平时我们开发时,可以直接调用相应大模型的接口,但当我们考虑到易用性、扩展性,使用LangChain是一个更好地选择,并且LangChain中还整合了很多组件和功能,包括:支持多种大语言模型、支持多种数据源连接、支持文本处理数据分析agent、提供部署和运维工具等。
下面基于Python和OpenAI介绍下LangChain的基本使用方式。
安装LangChain:pip install langchain
执行上面的命令后,会安装langchain、langchain-community、langchain-core等langchain相关的包。
安装openai:pip install openai
创建一个llm
安装好后,我们就可以使用LangChain就行开发了,先看一个简单的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| from langchain.llms import OpenAI
OPENAI_API_KEY = 'xxx'
def call(prompt=''): llm = OpenAI(openai_api_key=OPENAI_API_KEY, temperature=1, max_tokens=10, model_name='gpt-3.5-turbo-instruct') resp = llm.predict(prompt) return resp
if __name__ == '__main__': prompt = '你是谁?' resp = call(prompt) print(resp)
|
上面的例子中,我们使用 OpenAI 创建了一个 llm 对象,创建 llm 对象时传入的参数和直接调用 OpneAI Chat 接口时传入的参数几乎是一样的,具体有哪些参数,可以查看Python源码或者 LangChain 文档。
对于上面的例子,我们也可以使用 langchain-openai 库来实现。
首先安装 langchain-openai:pip install langchain-openai
安装好后,使用 langchain-openai 开发:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| from langchain_openai import OpenAI
OPENAI_API_KEY = 'xxx'
def call(prompt=''): llm = OpenAI(openai_api_key=OPENAI_API_KEY, temperature=1) resp = llm.predict(prompt) return resp
if __name__ == '__main__': prompt = '你是谁?' resp = call(prompt) print(resp)
|
使用 langchain.llms 的 OpenAI 和 langchain_openai 的 OpenAI 输出的效果是一样的,通过查看源码可以发现,这两个类最终都是继承的 BaseLLM 类。
创建一个chat llm
在 langchain 中,chat消息有四种类型,分别是:AIMessage, HumanMessage, SystemMessage、ChatMessage,
其中,AIMessage是 llm 的消息,HumanMessage是用户输入的消息,SystemMessage是系统的消息,ChatMessage是自定义的消息。
我们使用 langchain.chat_models 中的 ChatOpenAI 创建一个 chat llm:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| from langchain.chat_models import ChatOpenAI
OPENAI_API_KEY = 'xxx'
def call(prompt=''): llm = ChatOpenAI(openai_api_key=OPENAI_API_KEY, temperature=1) resp = llm.predict(prompt) return resp
if __name__ == '__main__': prompt = '今天晚饭吃什么' resp = call(prompt) print(resp)
|
当然,也可以将上面的 langchain.chat_models 替换成 langchain_openai,效果是一样的。
创建chat llm后,除了简单的调用 predict() 聊天之外,还可以通过使用 HumanMessage、SystemMessage 进行聊天,具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| from langchain.chat_models import ChatOpenAI from langchain.schema import HumanMessage, SystemMessage
OPENAI_API_KEY = 'xxx'
def call(prompt=''): llm = ChatOpenAI(openai_api_key=OPENAI_API_KEY, temperature=1) system_msg = '你是一个非常有经验的高级厨师,请帮我推荐有益健康的菜谱!'
messages = [SystemMessage(content=system_msg), HumanMessage(content=prompt)] resp = llm.predict_messages(messages) return resp
if __name__ == '__main__': prompt = '今天晚饭吃什么' resp = call(prompt) print(resp)
|
我们也可以通过 generate() 方法进行多组chat:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| from langchain.chat_models import ChatOpenAI from langchain.schema import HumanMessage, SystemMessage
OPENAI_API_KEY = 'xxx'
def call(prompt1='', prompt2=''): llm = ChatOpenAI(openai_api_key=OPENAI_API_KEY, temperature=1) system_msg1 = '你是一个非常有经验的高级厨师,轻轻帮我推荐有益健康的菜谱!' system_msg2 = '你是一个资深训练师,请给出如何保持身材的建议!'
batch_messages = [ [ SystemMessage(content=system_msg1), HumanMessage(content=prompt1) ], [ SystemMessage(content=system_msg2), HumanMessage(content=prompt2) ] ] resp = llm.generate(batch_messages) return resp
if __name__ == '__main__': prompt1 = '今天晚饭吃什么' prompt2 = '今天有什么锻炼计划' resp = call(prompt1, prompt2) print(resp.generations[0]) print("===================") print(resp.generations[1])
|
使用prompt模板
上面的几个例子中,都是使用的固定的prompt,如果我们想更加灵活的使用prompt,可以使用prompt模板,看一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| from langchain.llms import OpenAI from langchain.prompts import PromptTemplate from langchain.chains import LLMChain
OPENAI_API_KEY = 'xxx'
def call(who): llm = OpenAI(openai_api_key=OPENAI_API_KEY, temperature=1)
prompt = PromptTemplate.from_template("如果{who}生气了,我该怎么哄她?")
chain = LLMChain(llm=llm, prompt=prompt) resp = chain.run(who=who) return resp
if __name__ == '__main__': resp = call("女朋友") print(resp) print("=========================") resp = call("小猫") print(resp)
|
代码中使用 PromptTemplate 创建了一个 prompt 模板,通过使用 LLMChain 模块,将 prompt 和 llm 串联起来,最后执行并获取结果。
上面的例子中我们使用到了 LangChain中的 chain 模块:LLMChain。chain是 LangChain 中非常重要的一部分知识,通过使用 chain,我们将以模块化的方式调用大模型,即把 prompt 分成一个模块,调用 llm 分成一个模块,这两个模块之间互不影响,我们修改 prompt 时不会影响 llm,切换 llm 时也不会影响 prompt。chain 通过把调用大模型的过程切分成几个部分,降低了这几个部分之间的依赖关系,从而更加灵活,降低了后期更新和修改的成本。
LangChain中不只有 LLMChain,还有LLMRouterChain、LLMCheckerChain等,感兴趣的可以查看官方文档了解更多。
创建一个ConversationChain
在 LangChain 中,我们可以使用 ConversationChain 创建一个用于对话的应用。使用 ConversationChain 的好处在于,它会缓存聊天记录的上下文,使我们在对话时,大模型能够知道之前的聊天数据,从而给出更好地回答。下面看一个例子:
1 2 3 4 5 6 7 8 9 10 11
| from langchain.llms import OpenAI from langchain.chains import ConversationChain
OPENAI_API_KEY = 'xxx'
llm = OpenAI(openai_api_key=OPENAI_API_KEY) conversion = ConversationChain(llm=llm) conversion.run("你好呀") conversion.run("我叫小明") conversion.run("帮我写一份简历") conversion.run("我是谁")
|
代码中使用了 ConversationChain ,查看源码会发现,ConversationChain 中有一个 memory 参数,这个参数指定了聊天记录的缓存信息,使大模型能够知道之前对话的内容。memory 参数的默认值就是 ConversationBufferMemory。
我们可以使用下面的方式查看 memory 中缓存的所有内容:
1
| print(conversation.memory.load_memory_variables({}))
|
memory 除了使用 ConversationBufferMemory之外,还可以使用 ConversationBufferWindowMemory,它可以指定缓存最后 n 轮的对话内容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| from langchain.llms import OpenAI from langchain.chains import ConversationChain from langchain.memory import ConversationBufferWindowMemory
OPENAI_API_KEY = 'xxx'
def call(): llm = OpenAI(openai_api_key=OPENAI_API_KEY, temperature=1) memory = ConversationBufferWindowMemory(k=1) conversation = ConversationChain(llm=llm, memory=memory) resp = conversation.run("你好呀") print(resp) print("===========") resp = conversation.run("我是小明") print(resp) print("===========") resp = conversation.run("你能做什么") print(resp) print("===========")
print(conversation.memory.load_memory_variables({}))
if __name__ == '__main__': call()
|
以上就是本文介绍的 LangChain 的一些基本用法。
LangChain 官方文档:https://python.langchain.com/docs/get_started/introduction
LangChain GitHub仓库:https://github.com/langchain-ai/langchain