从0到1开发AI Agent(智能体)| LangChain 的快速入门
AI Agent,即人工智能代理,一般直接叫做智能体。是一种能够感知环境、做出决策并采取行动的系统。这些系统能够执行被动的任务,也能够主动寻找解决问题的方法,适应环境的变化,并在没有人类直接干预的情况下做出决策。
1. LangChain是什么?(示例代码基于 v0.3版本)
LangChain 是一个开源框架,目标是将大模型与外部数据连接起来,以便开发者能够更快和更容易地构建基于语言的 Al 应用。
LangChain的核心思想是通过模块化能设计和力抽象,将不同的组件和功能“链”在一起,以创建更复杂和多功能的语言处理系统。这些组件包括模型、聊天模型、文本嵌入模、型提示模板、索引、文档加载器、文本分割器、向量存储、检索器、记忆功能、链和代理等。这种设计不仅提高了系统的灵活性和可扩展性,还使得开发者可以根据具体需求自由组合和调整各个模块,从而实现更强大、更定制化的AI应用
通俗来说,LangChain 是一种帮助开发者用大模型制作“应用程序”的开发工具。它就像一个“搭建AI房子”的工具箱,里面有各种现成的积木,开发者只需要把这些积木拼起来,就可以实现很多强大的功能。
举个例子,假如你想制作一个智能客服,LangChain 可以:
- 给AI搭建大脑:让它用 ChatGPT 或类似的模型来回答问题。
- 记住用户信息:记住顾客的名字和之前的问题,避免每次都从头开始解释。
- 让AI会用工具:比如连接到公司数据库,查订单状态;或者直接用计算器给顾客算账。
- 处理复杂问题:比如顾客问一个"需要多步"才能回答的问题,LangChain 可以指导 AI 逐步完成。
2. LangChain全景
具体来说,该框架由以下开源库组成:
- langchain-core : 基础抽象和LangChain表达式 (LCEL)。
- langchain-community : 第三方集成。合作伙伴库(例如langchain-openai、langchain-anthropic 等):一些集成已进一步拆分为自己的轻量级库,仅依赖于langchain-core。
- langchain : 组成应用程序认知架构的链、代理和检索策略。
- LangGraph : 通过将步骤建模为图中的边和节点,构建强大且有状态的多参与者应用程序。与LangChain无缝集成,但也可以单独使用。
- LangServe : 将LangChain链部署为REST API。
- LangSmith : 一个开发者平台,让您调试、测试、评估和监控LLM应用程序。
3. 优点
3.1 LangChain 是一个灵活的框架,它提供了与多种大模型进行交互的能力(示例)。
虽然LangChain最初主要支持 OpenAI公司的模型,但它的设计允许集成和使用来自不同源的多种模型,包括但不限于OpenAl、Cohere和 Hugging Face 等模型库中的模型。这样,你不必拘泥于某种模型,而是为自己的应用选择最合适的模型。
通过LangChain 提供的ModelLaboratory(模型实验室),你可以测试并比较不同的模型。下面是一段通过 ModelLaboratory比较不同大模型的示例代码
需要确保已经安装langchain-openai、langchain-cohere和langchain-huggingface库,并申请OpenAI_API_KEY、COHERE_API_KEY和HUGGINGFACEHUB_API_TOKEN
Cohere 是一家专注于自然语言处理(NLP)技术的公司,提供强大的语言模型和AI服务。提供API接口,供开发者和企业在自己的应用中集成先进的语言理解和生成能力
Hugging Face 是一个开源人工智能公司,专注于自然语言处理(NLP)和机器学习(ML)的技术发展。它为开发者和研究人员提供了大量的预训练模型和工具,方便他们在各自的应用中使用机器学习模型。提供大量开源的预训练模型和工具,开发者可以自由下载并在本地进行训练和使用,也有 API 服务,更侧重于提供一个开源生态系统
这两个公司都有一堆模型可被调用,这里需要对比三者的调用结果有什么不同
安装依赖:
pip install langchain-cohere
pip install langchain-huggingface
# 导入langchain_openai库中的OpenAI类,用于与OpenAI进行交互
from langchain_openai import OpenAI
# 导入cohere,用于使用cohere的模型
from langchain_cohere import ChatCohere
# 导入huggingface,用于使用huggingface的模型
from langchain_huggingface import ChatHuggingFace,HuggingFaceEndpoint
import os
os.environ["CO_API_KEY"] = "myRKkidpqyuQqXZfe"
os.environ["HUGGINGFACEHUB_API_TOKEN"] = "hf_wQwVfvKMoGK"
# 初始化OpenAI、Cohere和HuggingFace的实例,并设置温度参数(控制生成文本的创新性)
openai = OpenAI(
api_key='hk-iwtbie100a91e427',
base_url='https://api.openai-hk.com/v1',
temperature=0.1
)
# Cohere command-xlarge-nightly这个模型支持中文;command模型不支持中文
cohere = ChatCohere(model="command-xlarge-nightly", temperature=0.1)
# HuggingFace
repo_id = "Qwen/Qwen2.5-72B-Instruct" # 使用千问的模型
llm = HuggingFaceEndpoint(
repo_id=repo_id,
temperature=0.1,
model_kwargs={'trust_remote_code':True}
)
huggingface = ChatHuggingFace(llm=llm, verbose=True)
# 导入ModelLaboratory类,用于创建和管理多个语言模型
from langchain.model_laboratory import ModelLaboratory
# 创建一个模型实验室实例,整合了OpenAI、Cohere和HuggingFace的模型
model_lab = ModelLaboratory.from_llms([openai, cohere, huggingface])
# 使用模型实验室比较不同模型对同一个问题“百合花是来源自哪个国家?”的回答
model_lab.compare("百合花是来源自哪个国家?")
输出结果:
###### 输入的提示词
Input:
百合花是来源自哪个国家?
###### OpenAI的回答
OpenAI
Params: {'model_name': 'gpt-3.5-turbo-instruct', 'temperature': 0.1, 'top_p': 1, 'frequency_penalty': 0, 'presence_penalty': 0, 'n': 1, 'logit_bias': {}, 'seed': None, 'logprobs': None, 'max_tokens': 256}
百合花最早起源于中国,后来传播到日本、韩国、欧洲等地。
###### Cohere的回答
client=<cohere.client.Client object at 0x00000214FC92BD90> async_client=<cohere.client.AsyncClient object at 0x0000021482AAAEC0> model='command-xlarge-nightly' temperature=0.1
百合花,即百合属(学名:Lilium)植物,是一种多年生草本植物,原产于北半球温带地区。它广泛分布在欧洲、亚洲和北美等地,不同品种的百合花可能源自不同的国家和地区。
其中,亚洲是百合花的主要分布区域,中国、日本和韩国都有丰富的百合花品种。中国是百合花的重要原产国,拥有许多独特的野生百合品种,如卷丹、山丹、百合等。
欧洲的百合花品种也非常丰富,如法国的东方百合、英国的圣洁百合等。
北美地区也有许多百合花品种,如北美百合、加拿大百合等。
因此,不同种类的百合花可能源自不同的国家,但总体来说,百合花是广泛分布在北半球温带地区的植物。
###### HuggingFace的回答
llm=HuggingFaceEndpoint(repo_id='Qwen/Qwen2.5-72B-Instruct',
.... 省略 ....
} model_id='Qwen/Qwen2.5-72B-Instruct'
百合花是一种非常古老的植物,其种类繁多,分布广泛,因此不能简单地说它起源于某一个国家。不过,关于百合属植物(Lilium)的原始分布地,科学界普遍认为大部分百合种类最初分布在亚洲东部,特别是中国、日本和俄罗斯的远东地区。中国是百合属植物的主要分布中心之一,拥有许多野生种类。因此,可以说百合花与中国有着密切的联系。同时,百合属植物也在欧洲和北
参考:
https://python.langchain.com/docs/integrations/providers/cohere/
https://python.langchain.com/api_reference/huggingface/chat_models/langchain_huggingface.chat_models.huggingface.ChatHuggingFace.html#langchain_huggingface.chat_models.huggingface.ChatHuggingFace
https://python.langchain.ac.cn/docs/integrations/llms/huggingface_endpoint/
3.2 LangChain封装了很多大模型应用开发理念的技术实现细节
这种封装能省好多事,具体包括管理提示模板和提示词、与不同类型的大模型进行交互的通用接口、完成语言逻辑思维框架(例如 ReAct)的代码实现、与外部数据源交互、创建交互式 Agent、维护链或 Agent 调用的状态,以及实现历史对话的记忆功能等。
例如,我们只需调用 create_react_agent函数,就可以创建一个具有ReAct思维框架的 Agent,轻松实现 ReAct 的推理功能 - 所有的细节都被封装在 LangChain 的API中。
ReAct见:从0到1开发AI Agent(智能体)(二)| 智能体推理引擎ReAct框架的快速入门
3.3 LangChain 的第三方应用接口多且全,与大量其他AI开发相关的库和工具进行集成。
例如LangChain包含与各种向量数据库进行交互的接口。这为我们进行大模型应用开发提供了一站式解决方案。
4. 注意事项
因为LangChain 提供了丰富的功能、工具和第三方接口,所以它的功能和整个生态环境显得过于复杂,这可能会给初学者或不熟悉大模型的开发者带来挑战。其次,通过 LangChain开发的复杂应用在处理过多数据时也可能会遇到效率问题。最后LangChain 还在迅速发展,其版本迭代速度非常快,旧的代码在新版本中可能无法正常运行。
最后这个问题需要注意,现在网上很多示例是基于旧版本的
5. LCEL(LangChain Expression Language)(示例)
为了让基于大模型的Al应用开发变得容易,LangChain 推出了LangChain Expression Language(简称 LCEL)。LCEL是一种声明式语言。它可以使 LangChain 中各组件的组合变得简单且直观。
LCEL 的特点如下:
- 流式处理,即在与大模型交互的过程中尽可能快地输出首个Token,同时确保数据的连续性和不断输出,维持一个持续稳定的交互流程。
- 异步操作,能在同一台服务器上处理多个并发请求
- 自动并行执行那些可以并行的步骤,以实现尽可能低的延迟
- 允许配置重试和后备选项,使链在规模上更可靠。
- 允许访问复杂链的中间结果,并与LangSmith跟踪和LangServe部署无缝集成
示例:
# 导入所需的库
from langchain_core.output_parsers import StrOutputParser # 用于解析输出结果为字符串
from langchain_core.prompts import ChatPromptTemplate # 用于创建聊天提示模板
from langchain_openai import ChatOpenAI # 用于调用OpenAI的GPT模型
# 创建一个聊天提示模板,其中{topic}是一个占位符,用于后续插入具体的话题
prompt = ChatPromptTemplate.from_template("请讲一个关于 {topic} 的故事")
# 初始化ChatOpenAI对象,指定使用的模型为"gpt-4"
# model = ChatOpenAI(model="gpt-4-mini")
model = ChatOpenAI(
api_key='hk-iwtbie91e427',
base_url='https://api.openai-hk.com/v1',
temperature=0.1
)
# 初始化一个输出解析器,用于将模型的输出解析成字符串
output_parser = StrOutputParser()
'''使用管道操作符(|)连接各个处理步骤,创建一个处理链
其中prompt用于生成具体的提示文本,
model用于根据提示文本生成回应,
output_parser用于处理回应并将其转换为字符串'''
chain = prompt | model | output_parser
# 调用处理链,传入话题"水仙花",执行生成故事的操作
message = chain.invoke({"topic": "水仙花"})
# 打印链的输出结果
print(message)
从前,有一朵美丽的水仙花,她生长在一个幽静的小花园里。水仙花的花瓣洁白如雪,花蕊娇嫩如玉,散发着淡淡的清香,吸引了许多蜜蜂和蝴蝶前来采蜜。
水仙花非常喜欢阳光和清新的空气,每天都在花园里欢快地舞动着花瓣,享受着自由自在的生活。她和其他花朵们相处融洽,彼此之间互相照顾,共同绽放出美丽的花海。
然而,有一天,一场暴风雨袭击了小花园,水仙花被狂风吹倒在地,花瓣被雨水打湿,显得狼狈不堪。其他花朵们纷纷为她担心,希望她能够振作起来。
水仙花虽然受伤了,但她并没有放弃,她努力地挣扎着站起来,用最后一丝力气重新展开花瓣,绽放出最后一丝光芒。她告诉其他花朵们:“即使受伤,也要坚强地面对,因为生命中总会有风雨,只有坚强才能战胜困难。”
最终,水仙花顽强地度过了风雨,重新恢复了往日的美丽。她的坚强和勇敢感动了其他花朵们,大家都学会了面对困难时要坚强不屈,不轻易放弃。
从此以后,水仙花成为了小花园里最受尊敬的花朵,她的故事也被传颂开来,成为了一代代花朵们学习的楷模。每当风雨来临时,大家都会想起水仙花的故事,坚定地面对挑战,勇敢地前行。
LCEL 是通过“|” 符号连接不同组件的。首先,通过 PromptTemplate 生成针对大模型的提示,插入实际的问题。然后,将这个提示发送给OpenAI组件(即语言模型),模型根据提示生成回答。最后,通过 StrOutputParser解析模型的输出,确保输出是字符串格式 这个示例展示了通过串联不同的组件(如输入处理、模型调用、输出解析等)来构建复杂的语言处理任务的基本流程。
6. LangChain 的核心功能
- 链(Chains)
- LangChain 支持将多个 LLM 调用和工具操作链接成工作流,比如从用户提问到返回答案的多步骤处理。
- 工作流可以动态适应输入内容,特别适合构建复杂任务的自动化流程。
- 提示模板(Prompt Templates)
- 提供动态模板化提示生成工具,优化提示质量并提高 LLM 的输出表现。开发者可以轻松重复使用和调整提示。
- 记忆(Memory)
- 内置上下文记忆功能,可以保留会话历史,用于创建更连贯的对话体验。
- 支持短期记忆(会话内存储)和长期记忆(跨会话存储,例如结合向量数据库)。
- 工具(Tools)与代理(Agents)
- 工具:集成搜索引擎、数据库、API 等功能,扩展 LLM 的能力。
- 代理:通过代理动态决策调用哪些工具,完成复杂任务(如知识查询或计算)。
- 数据增强生成(RAG, Retrieval-Augmented Generation)
- 将外部知识库(文档、数据库)与 LLM 结合,动态检索相关内容以提升回答的准确性。
- 向量数据库集成
- 支持向量数据库,用于语义搜索和知识库管理。
- LangGraph
- 新推出的工具库,用于构建多智能体(multi-agent)和多状态应用,推荐用于设计复杂代理系统。
7. LangChain和Agent开发
在构建 Agent 时,LangChain 可以作为一个强大的框架来整合不同的 AI模型和工具,提供更连贯和复杂的对话流程,以及信息检索和处理能力。
因此,它允许开发者构建更复杂、更智能的 Agent。LangChain 提供了大量工具,可以将大模型连接到其他数据或计算源,包括搜索引擎、API和其他数据存储。大模型通过工具可以获取最新的数据,并将其作为上下文插入提示中。工具还可以用来执行行动(如运行代码、修改文件等)。大模型观察这些行动的结果,以决定下一步要做什么。
LangChain 通过 Agent执行器(Agent Executor)运行 Agent的逻辑,当满足某些标准时才停止运行。
下图展示了一个由 LangChain Agent 驱动的典型的大模型系统设计架构。
在上图所示的架构中,用户通过服务器提供提示词(Prompt),系统则通过索引(Indexes,也就是 Retrieval)检索信息。这些信息被用来更新系统的记忆(Memory)为处理用户的输入提供上下文。
系统核心是模型(Model),其中包括一个大模型,可能是用于理解和生成语言的AI。大模型通过链(Chains)与其他模型相连,这可能意味着不同模型之间的信息流动和合作。
在系统底部,多个Agent负责执行具体任务。它们可以完成不同的操作,并且可能独立工作。每个 Agent都可能代表系统中的一个功能模块或服务。用户的提示被模型处理后,系统产生输出(Output),并可能通过回调(Callbacks)触发额外的动作或处理,这通常用于处理异步事件或在满足某些条件时执行特定的函数。
整个过程形成了一个从输入到输出的循环,涉及信息检索、记忆更新、模型处理和动作执行,最终达到响应用户请求的目的。这个过程体现了LangChain的模块化和灵活性允许系统根据需要动态地组合不同的功能和服务。
本文转载自 AI取经路,作者: AI取经路