01_LangChain快速入门与底层原理

279 阅读6分钟

LangChain 特性

  • LLM 和提示(Prompt):LangChain 对所有 LLM 大模型进行了 API 抽象,统一了大模型访问 API,同时提供了 Prompt 提示模板管理机制。
  • 链 (Chain):Langchain 对一些常见的场景封装了一些现成的模块,例如:基于上下文信息的问答系统,自然语言生成 SQL 查询等等,因为实现这些任务的过程就像工作流一样,一步一步的执行,所以叫链 (chain)。
  • LCEL:LangChain Expression Language (LCEL), langchain 新版本的核心特性,用于解决工作流编排问题,通过 LCEL 表达式,我们可以灵活的自定义 AI 任务处理流程,也就是灵活自定义链 (Chain)。
  • 数据增强生成 (RAG):因为大模型 (LLM) 不了解新的信息,无法回答新的问题,所以我们可以将新的信息导入到 LLM,用于增强 LLM 生成内容的质量,这种模式叫做 RAG 模式(Retrieval Augmented Generation)。
  • Agents:是一种基于大模型(LLM)的应用设计模式,利用 LLM 的自然语言理解和推理能力(LLM 作为大脑)),根据用户的需求自动调用外部系统、设备共同去完成任务,例如:用户输入 "明天请假一天", 大模型(LLM)自动调用请假系统,发起一个请假申请。
  • 模型记忆(memory):让大模型 (llm) 记住之前的对话内容,这种能力成为模型记忆(memory)。

LangChain 框架组成

LangChain 框架由几个部分组成,包括:

  • LangChain 库:Python 和 JavaScript 库。包含接口和集成多种组件的运行时基础,以及现成的链和代理的实现。
  • LangChain 模板:Langchain 官方提供的一些 AI 任务模板。
  • LangServe:基于 FastAPI 可以将 Langchain 定义的链 (Chain),发布成为 REST API。
  • LangSmith:开发平台,是个云服务,支持 Langchain debug、任务监控。

LangChain 库 (Libraries)

LangChain 库本身由几个不同的包组成:

  • langchain-core:基础抽象和 LangChain 表达语言。
  • langchain-community:第三方集成,主要包括 langchain 集成的第三方组件。
  • langchain:主要包括链 (chain)、代理(agent) 和检索策略。

langchain 任务处理流程

如上图,langChain 提供一套提示词模板 (prompt template) 管理工具,负责处理提示词,然后传递给大模型处理,最后处理大模型返回的结果。 LangChain 对大模型的封装主要包括 LLM 和 Chat Model 两种类型:

  • LLM - 问答模型,模型接收一个文本输入,然后返回一个文本结果。
  • Chat Model - 对话模型,接收一组对话消息,然后返回对话消息,类似聊天消息一样。

核心概念

1. LLMs

LangChain 封装的基础模型,模型接收一个文本输入,然后返回一个文本结果。

2. Chat Models

聊天模型(或称为对话模型),与 LLMs 不同,这些模型专为对话场景而设计。模型可以接收一组对话消息,然后返回对话消息,类似聊天消息一样。

3. 消息(Message)

指的是聊天模型(Chat Models)的消息内容,消息类型包括 HumanMessage、AIMessage、SystemMessage、FunctionMessage 和 ToolMessage 等多种类型的消息。

4. 提示 (prompts)

LangChain 封装了一组专门用于提示词 (prompts) 管理的工具类,方便我们格式化提示词 (prompts) 内容。

5. 输出解析器 (Output Parsers)

Langchain 接受大模型 (llm) 返回的文本内容之后,可以使用专门的输出解析器对文本内容进行格式化,例如解析 json、或者将 llm 输出的内容转成 python 对象。

6. Retrievers

为方便我们将私有数据导入到大模型(LLM),提高模型回答问题的质量,LangChain 封装了检索框架 (Retrievers),方便我们加载文档数据、切割文档数据、存储和检索文档数据。

7. 向量存储 (Vector stores)

为支持私有数据的语义相似搜索,langchain 支持多种向量数据库。

8. Agents

智能体 (Agents),通常指的是以大模型(LLM)作为决策引擎,根据用户输入的任务,自动调用外部系统、硬件设备共同完成用户的任务,是一种以大模型(LLM)为核心的应用设计模式。

应用场景

  • 对话机器人: 构建智能的对话助手、客服机器人、聊天机器人等。
  • 知识库问答: 结合知识图谱, 进行开放域问题的问答服务。
  • 智能写作: 如文章写作、创意写作、文本摘要等

快速入门

1. 安装LangChain

要安装LangChain,可以使用Pip和Conda进行安装。以下是安装LangChain的步骤:

# 使用Pip安装
pip install langchain
pip install langchain-openai
pip install langchain-community

# 如果需要使用向量数据库功能
pip install langchain-chroma

2. 初始化模型

在使用LangChain之前,需要导入LangChain x OpenAI集成包,并设置API密钥作为环境变量或直接传递给OpenAI LLM类。

首先,获取OpenAI的API密钥,可以通过创建账户并访问此链接来获取。然后,可以将API密钥设置为环境变量,方法如下:

import os
from langchain_openai import OpenAI

# 方法1:设置环境变量
os.environ["OPENAI_API_KEY"] = "your-api-key"

# 方法2:直接传递给LLM类
llm = OpenAI(api_key="your-api-key")

# 初始化模型并设置参数
llm = OpenAI(
    model_name="gpt-3.5-turbo-instruct",  # 选择模型
    temperature=0.7,  # 控制创造性,0为最确定性,1为最创造性
    max_tokens=256    # 限制输出的最大token数
)

3. 使用LLM

使用LLM来回答问题非常简单。可以直接调用LLM的invoke方法,并传入问题作为参数。

# 简单调用LLM
response = llm.invoke("什么是人工智能?")
print(response)

4. 使用提示模板(Prompt Template)

提示模板可以帮助我们更好地构建提示词,使模型理解我们的需求:

from langchain.prompts import PromptTemplate

# 创建提示模板
prompt_template = PromptTemplate.from_template(
    "请用简单的语言解释{concept},就像向一个10岁的孩子解释一样。"
)

# 使用模板生成提示
prompt = prompt_template.format(concept="量子力学")
response = llm.invoke(prompt)
print(response)

5. 构建LLM链(Chains)

下面演示了如何构建一个简单的LLM链(chains):

from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain_openai import OpenAI

# 初始化LLM
llm = OpenAI(temperature=0.7)

# 创建提示模板
template = "请为一家销售{product}的公司写一个简短的广告语。"
prompt = PromptTemplate.from_template(template)

# 创建LLM链
chain = prompt | llm

# 运行链
result = chain.run(product="智能家居设备")
print(result)

6. 输出转换

LLM的输出通常是一条消息,为了更方便处理结果,可以将消息转换为字符串或结构化数据:

from langchain_core.output_parsers import StrOutputParser
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field
from typing import List

# 1. 简单字符串转换
output_parser = StrOutputParser()
chain = prompt | llm | output_parser

result = chain.invoke({"concept": "相对论"})
print(result)  # 现在结果是字符串而非消息对象

# 2. JSON输出解析示例
class Product(BaseModel):
    name: str = Field(description="产品名称")
    features: List[str] = Field(description="产品特性列表")
    price_range: str = Field(description="价格范围")

json_parser = JsonOutputParser(pydantic_object=Product)

prompt_template = PromptTemplate(
    template="""
    请生成一个关于{product_type}的产品信息,包括名称、特性和价格范围。
    {format_instructions}
    """,
    input_variables=["product_type"],
    partial_variables={"format_instructions": json_parser.get_format_instructions()}
)

chain = prompt_template | llm | json_parser

result = chain.invoke({"product_type": "智能手表"})
print(f"产品名称: {result.name}")
print(f"产品特性: {', '.join(result.features)}")
print(f"价格范围: {result.price_range}")