【LangChain】LangChain框架快速入门
前言
本文将会介绍LangChain框架,并以python代码示例来解释该框架的作用,使用到了OpenAI的API,并附上代码和结果,感兴趣的读者可以跟着跑代码。
LangChain框架是什么
LangChain 是一个用于构建和部署基于语言模型(如大型语言模型,LLM)的应用程序的框架。想象一下,LangChain 就像是一个工具箱,里面装满了各种工具和指导手册,帮助你更容易地创建和优化与语言相关的软件项目。
LangChain框架的实际作用主要体现在以下几个方面:
- 开发LLM应用:
- LangChain提供了一套工具和组件,简化了基于大型语言模型(LLMs)的应用开发过程。
- 应用场景:聊天机器人、虚拟助手、语言翻译工具和情感分析工具等,都是可以利用LangChain来创建的LLM驱动的应用。
- 集成不同模型和数据:
- LangChain允许开发者将不同的语言模型、数据源和工具连接起来,创建更强大的应用。
- 应用场景:例如,可以结合多个LLMs,使用输出作为下一个LLM的输入,或者将LLMs与外部数据源集成,用于问答系统。
- 提供模板和工具:
- LangChain提供了模板,允许开发者快速开始构建特定的应用,如使用自定义数据构建聊天机器人或从非结构化数据中提取结构化数据。
- 应用场景:开发者可以使用这些模板来减少开发时间和成本,快速部署应用。
- 调试、测试和监控:
- LangSmith作为LangChain的一部分,允许开发者调试、测试、评估和监控他们的LLM应用。
- 应用场景:在开发过程中,开发者可以利用LangSmith来优化和部署应用,确保应用的稳定性和性能。
- 部署为API:
- LangServe是LangChain的一部分,它帮助开发者将他们的应用部署为REST API,使得应用可以被更广泛地访问和交互。
- 应用场景:开发者可以将他们的LLM应用部署为API,提供给其他开发者或用户使用。
- 处理文档和数据:
- LangChain提供了多种工具来处理文档和数据,如文档加载器、文本分割器和索引/检索器。
- 应用场景:在需要处理大量文档或非结构化数据的场景中,LangChain可以帮助提取、组织和检索信息。
- 构建复杂的工作流:
- LangChain允许开发者构建包含多个步骤的工作流,将LLMs与其他组件结合,如提示模板、长期记忆等。
- 应用场景:在需要复杂逻辑和多步骤交互的应用中,如客户服务自动化,LangChain可以提供强大的支持。
关键模块
LangChain 框架的关键模块如下
- Models (模型)
- 该模块是由 LangChain 提供的标准接⼝,你可以通过它与各种 LLM 进 ⾏交互。 LangChain ⽀持集成 OpenAI 、 Hugging Face 、 Cohere 、 GPT4All 等 提供商提供的不同类型的模型。
- Prompts (提⽰词)
- 提⽰词已成为 LLM 编程的新标准。该模块包含许多⽤于管理提⽰词的 ⼯具。
- Indexes (索引)或 Retrieval 模块
- 该模块让你能够将 LLM 与你的数据结合使⽤
- Chains (链)
- 通过该模块, LangChain 提供了 Chain 接⼝。你可以使⽤该接⼝创建⼀ 个调⽤序列,将多个模型或提⽰词组合在⼀起。
- Agents (智能体)
- 该模块引⼊了 Agent 接⼝。所谓智能体,就是⼀个可以处理⽤户输 ⼊、做出决策并选择适当⼯具来完成任务的组件。它以迭代⽅式⼯作,采 取⼀系列⾏动,直到解决问题。
- Memory (记忆)
- 该模块让你能够在链调⽤或智能体调⽤之间维持状态。默认情况下, 链和智能体是⽆状态的。这意味着它们独⽴地处理每个传⼊的请求,就像 LLM ⼀样。
LangChain 是⽤于不同 LLM 的通⽤接⼝,你可以查阅其⽂档以了解更多信 息。 LangChain 的⽂档包含⼀份集成列表,其中涉及 OpenAI 和其他许多 LLM 提供商。⼤多数集成需要 API 密钥才能建⽴连接。对于 OpenAI 模 型,可以在环境变量 OPENAI_API_KEY 中设 置 API 密钥。
安装LangChain框架
pip install langchain
动态提示词
from langchain.chat_models import ChatOpenAI
from langchain import PromptTemplate, LLMChain
template = """Question: {question}
Let's think step by step.
Answer: """
prompt = PromptTemplate(template=template,
input_variables=["question"])
llm = ChatOpenAI(model_name="gpt-4")
llm_chain = LLMChain(prompt=prompt, llm=llm)
question = """ What is the population of the capital of the country
where the Olympic Games were held in 2016? """
llm_chain.run(question)
PromptTemplate 负责构建模型的输⼊。也就是说,它能以可复制的⽅式 ⽣成提⽰词。它包含⼀个名为 template 的输⼊⽂本字符串,其中的值可 以通过 input_variables 进⾏指定。在本例中,我们定义的提⽰词会⾃ 动将 “Let's think step by step” 部分添加到问题中。
本例使⽤的 LLM 是 gpt-4 。⽬前,默认模型是 gpt-3.5-turbo 。 ChatOpenAI 函数将模型的名称赋给变量 llm 。这个函数假定⽤户在环境变量OPENAI_API_KEY 中设置了 API 密钥 。
提⽰词和模型由 LLMChain 函数组合在⼀起,形成包含这两个元素的⼀条 链。最后,我们需要调⽤ run 函数来请求补全输⼊问题。当运⾏ run 函数 时, LLMChain 使⽤提供的输⼊键值(以及可⽤的记忆键值)格式化提⽰词模板,随后将经过格式化的字符串传递给 LLM ,并返回 LLM 输出。我 们可以看到,模型运⽤ “ 逐步思考 ” 的技巧⾃动回答问题。
智能体及⼯具
智能体及⼯具是 LangChain 框架提供的关键功能:它们可以使应⽤程序变 得⾮常强⼤,让 LLM 能够执⾏各种操作并与各种功能集成,从⽽解决复杂 的问题。
这⾥所指的 “ ⼯具 ” 是围绕函数的特定抽象,使语⾔模型更容易与之交互。 智能体可以使⽤⼯具与世界进⾏交互。具体来说,⼯具的接⼝有⼀个⽂本 输⼊和⼀个⽂本输出。 LangChain 中有许多预定义的⼯具,包括⾕歌搜索、 维基百科搜索、 Python REPL 、计算器、世界天⽓预报 API 等。要获取完整 的⼯具列表,请查看 LangChain ⽂档中的⼯具⻚⾯。除了使⽤预定义的⼯ 具,你还可以构建⾃定义⼯具并将其加载到智能体中,这使得智能体⾮常 灵活和强⼤。
本节介绍⼀种适⽤于应⽤程序的智能体,它需要⼀系列中间步骤。该智能 体安排执⾏这些步骤,并可以⾼效地使⽤各种⼯具响应⽤户的查询。从某 种意义上说,因为 “ 逐步思考 ” ,所以智能体有更多的时间来规划⾏动,从 ⽽完成更复杂的任务。
智能体安排的步骤如下所述。
- 智能体收到来⾃⽤户的输⼊。
- 智能体决定要使⽤的⼯具(如果有的话)和要输⼊的⽂本。
- 使⽤该输⼊⽂本调⽤相应的⼯具,并从⼯具中接收输出⽂本。
- 将输出⽂本输⼊到智能体的上下⽂中。
- 重复执⾏步骤 2 〜步骤 4 ,直到智能体决定不再需要使⽤⼯具。此时, 它将直接回应⽤户。
使用工具的好处
就本节⽽⾔,我们希望模型能够回答以下问题: 2016 年奥运会举办国⾸都 的⼈⼝的平⽅根是多少?这个问题并没有特殊的含义,但它很好地展⽰了 LangChain 智能体及⼯具如何提⾼ LLM 的推理能⼒。
如果将问题原封不动地抛给 GPT-3.5 Turbo ,那么我们会得到以下回答:
The capital of the country where the Olympic Games were held in 2016 is Rio de Janeiro, Brazil. The population of Rio de Janeiro is approximately 6.32 million people as of 2021. Taking the square root of this population, we get approximately 2,513.29. Therefore, the square root of the population of the capital of the country where the Olympic Games were held in 2016 is approximately 2,513.29
这个回答⾄少有两处错误:巴⻄的⾸都是巴⻄利亚,⽽不是⾥约热内卢; 6 320 000 的平⽅根约等于 2513.96 ,⽽不是 2513.29 。我们可以通过运⽤ “ 逐 步思考 ” 或其他提⽰⼯程技巧来获得更好的结果,但由于模型在推理和数学 运算⽅⾯存在困难,因此我们很难相信结果是准确的。使⽤ LangChain 可 以给我们更好的准确性保证。
如以下代码所⽰, LangChain 智能体可以使⽤两个⼯具:维基百科搜索和计 算器。在通过 load_tools 函数创建⼯具之后,我们使⽤ initialize_agent 函数创建智能体。智能体的推理功能需要⽤到⼀个 LLM ,本例使⽤的是 gpt-3.5-turbo 。参数 ZERO_SHOT_REACT_DESCRIPTION 定义了智能体如何在每⼀步中选择⼯ 具。通过将 verbose 的值设置为 True ,我们可以查看智能体的推理过 程,并理解它是如何做出最终决策的。
from langchain.chat_models import ChatOpenAI
from langchain.agents import load_tools, initialize_agent, AgentType
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
tools = load_tools(["wikipedia", "llm-math"], llm=llm)
agent = initialize_agent(
tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
question = """What is the square root of the population of the capital of the Country where the Olympic Games were held in 2016?"""
agent.run(question)
在使⽤维基百科搜索⼯具之前,需要安装相应的 Python 包 wikipedia 。可以使⽤ pip install wikipedia 来安装这个包。
正如你所看到的,智能体决定查询维基百科以获取有关 2016 年奥运会的信 息:
> Entering new chain...
I need to find the country where the Olympic Games were held in 2016 and then find the population of its capital city. Then I can take the square root of that population.
Action: Wikipedia
Action Input: "2016 Summer Olympics"
Observation: Page: 2016 Summer Olympics
[...]
输出的下⼀⾏包含维基百科关于奥运会的摘录。接下来,智能体使⽤维基 百科搜索⼯具⼜进⾏了两次额外的操作:
Thought:I need to search for the capital city of Brazil.
Action: Wikipedia
Action Input: "Capital of Brazil"
Observation: Page: Capitals of Brazil
Summary: The current capital of Brazil, since its construction in 1960, is Brasilia. [...]
Thought: I have found the capital city of Brazil, which is Brasilia.
Now I need to find the population of Brasilia.
Action: Wikipedia
Action Input: "Population of Brasilia"
Observation: Page: Brasilia
[...]
下⼀步,智能体使⽤计算器⼯具:
Thought: I have found the population of Brasilia, but I need to calculate the square root of that population.
Action: Calculator
Action Input: Square root of the population of Brasilia (population: found in previous observation)
Observation: Answer: 1587.051038876822
得出最终答案:
Thought: I now know the final answer
Final Answer: The square root of the population of the capital of the country where the Olympic Games were held in 2016 is approximately 1587.
> Finished chain.
正如你所⻅,该智能体展⽰了较强的推理能⼒:在得出最终答案之前,它 完成了 4 个步骤。 LangChain 框架使开发⼈员能够仅⽤⼏⾏代码就实现这种 推理能⼒。
点击【LangChain】LangChain框架快速入门查看全文