AIGC:AI 开发者必学,一文快速入门 LangChain

在本文中,我们将通过一个完整的示例程序,介绍 LangChain 的基本结构。这个程序实现了一个简单的翻译服务,用户可以通过 HTTP 请求输入待翻译的文本和目标语言,LangChain 会使用 OpenAI 模型处理请求,并返回翻译结果。通过这个程序,我们将详细讲解 LangChain 的三大核心组件:Prompt Template、Model 和 Parser,并探讨如何通过链式调用(Chain)将它们组合在一起。

以下是完整的代码:

python 复制代码
#!/usr/bin/env python
from fastapi import FastAPI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import AzureChatOpenAI
from langserve import add_routes
from dotenv import load_dotenv
import os

# Load environment variables from .env file
load_dotenv()

# 1. Create prompt template
system_template = "Translate the following into {language}:"
prompt_template = ChatPromptTemplate.from_messages([
    ('system', system_template),
    ('user', '{text}')
])

# 2. Create model
model = AzureChatOpenAI(
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
    azure_deployment=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME"),
    openai_api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
)

# 3. Create parser
parser = StrOutputParser()

# 4. Create chain
chain = prompt_template | model | parser

# 4. App definition
app = FastAPI(
  title="LangChain Server",
  version="1.0",
  description="A simple API server using LangChain's Runnable interfaces",
)

# 5. Adding chain route
add_routes(
    app,
    chain,
    path="/chain",
)

if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="localhost", port=8000)

1. LangChain 的三大重要组成部分

在 LangChain 中,程序有三个关键部分:Prompt TemplateModelParser。这些模块一起构建了整个链式调用的基础。

(1) Prompt Template

Prompt Template 是用来为模型生成适当的提示词。LangChain 提供了灵活的模板化功能,让你可以根据不同需求生成个性化的 prompt。例如,下面的 system_template 用来告诉系统如何翻译输入的内容:

python 复制代码
system_template = "Translate the following into {language}:"

通过 ChatPromptTemplate,我们可以将系统提示和用户输入整合成一个可运行的提示模板:

python 复制代码
prompt_template = ChatPromptTemplate.from_messages([
    ('system', system_template),
    ('user', '{text}')
])

这个模板接受两个变量:languagetext,分别代表翻译的目标语言和用户的输入文本。

(2) Model

接下来是模型部分。在这个例子中,我们使用的是 Azure 提供的 OpenAI API。通过将 API 端点、部署名称和密钥等配置引入,LangChain 可以直接调用 OpenAI 的服务来处理 prompt。下面是模型的创建代码:

python 复制代码
model = AzureChatOpenAI(
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
    azure_deployment=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME"),
    openai_api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
)

这一步确保了我们的 prompt 被发送到 OpenAI 的模型,并能接收到相应的回答。

(3) Parser

最后一步是解析模型的输出。在这个例子中,我们使用了 StrOutputParser,它会将模型的响应解析为字符串形式:

python 复制代码
parser = StrOutputParser()

通过这个 parser,我们可以确保模型返回的结果以适当的形式输出给用户。

链式调用:将 Prompt Template、Model 和 Parser 链接在一起

这三者通过管道式的运算符 | 被串联起来,形成了一个完整的调用链:

python 复制代码
chain = prompt_template | model | parser

这就是 LangChain 的核心概念之一:链(Chain)。每一个链条都由多个可以运行的部分组成,通过简单的组合,我们可以快速构建出复杂的应用。

2. LCEL 语法及 LangChain 链的概念

LCEL(LangChain Expression Language)是 LangChain 中用于定义链式调用的语法,通过 LCEL,我们可以用非常直观的方式表达复杂的链式操作。在上面的代码中,我们通过 | 符号将不同组件串联起来,这正是 LCEL 的核心语法。每个组件都是一个独立的、可以运行的部分(Runnable),并且可以通过这种方式进行组合、链接,最终实现链式调用。

比如:

python 复制代码
chain = prompt_template | model | parser

这一行代码展示了链式调用的精髓。用户输入数据后,它会被 Prompt Template 格式化为一个 prompt,然后传递给 Model 进行处理,最后交由 Parser 解析为用户需要的输出格式。

3. 调用这个简单的 LangChain 服务

通过以上代码,我们已经创建了一个简单的 LangChain API 服务。接下来,我们讨论如何调用这个服务。

(1) 传统的 Request/Response 方法:/chain/invoke

最常见的服务调用方式是通过传统的 HTTP 请求-响应模式。我们在 API 中为链式调用添加了一个路径 /chain,用户可以通过 POST 请求访问这个路径,传入数据,并接收链式调用的最终输出。具体请求格式如下:

bash 复制代码
POST /chain/invoke
Content-Type: application/json

{
  "input": {
    "language": "Spanish",
    "text": "Hello, how are you?"
  }
}

在这个例子中,我们传入了目标语言 Spanish 和待翻译的文本 Hello, how are you?。服务器会执行链式调用,并返回翻译后的结果。

(2) 流式调用:/chain/stream

另一种调用方式是通过 Server-Sent Events(SSE)实现的流式调用。这种方法允许服务器将模型输出逐步发送给客户端,适用于需要处理长时间任务或流式生成文本的场景。在这个例子中,/chain/stream 路径支持 SSE,用户可以通过该路径接收实时的输出流。

bash 复制代码
GET /chain/stream

当服务器处理完每一部分数据时,客户端会实时收到生成的结果,这对一些生成较慢或需要逐步呈现的任务非常有用。

4. 总结

通过这篇文章,我们了解了 LangChain 的核心组成部分:Prompt TemplateModelParser,以及如何将它们通过链式调用(Chain)进行组合。此外,我们还介绍了如何通过传统的请求响应模式和流式调用来使用一个简单的 LangChain API 服务。

LangChain 提供了一种简单、高效的方式来构建复杂的语言模型应用程序。通过它的模块化设计和链式结构,开发者可以快速搭建灵活且强大的应用,满足各种 NLP 任务的需求。

相关推荐
爱思德学术-IAAST10 分钟前
中欧科学家论坛暨第六届人工智能与先进制造国际会议(AIAM 2024)在德国法兰克福成功举办,两百余名中外科学家共襄盛举
人工智能·学习·制造·学习方法·学术
deephub44 分钟前
过采样与欠采样技术原理图解:基于二维数据的常见方法效果对比
人工智能·python·机器学习·采样技术
HyperAI超神经1 小时前
对标Hugging Face?GitHub Models新增OpenAI o1/Llama 3.2等, 新功能支持模型并排比较
人工智能·机器学习·github·llama·huggingface
Topstip1 小时前
GitHub Copilot 转型采用多模型策略,支持 Claude 3.5 和 Gemini
人工智能·ai
Devil枫1 小时前
腾讯云云开发深度解读:云数据库、云模板与AI生成引用的魅力
数据库·人工智能·腾讯云
姚杰献1 小时前
机器学习、深度学习和强化学习的区别
人工智能·深度学习·机器学习
love_and_hope1 小时前
Pytorch学习--神经网络--线性层及其他层
人工智能·pytorch·python·深度学习·神经网络·学习·pip
vivid_blog1 小时前
大语言模型(LLM)入门级选手初学教程 II
人工智能·语言模型·自然语言处理
ToTensor2 小时前
CUDA环境安装终极指南——Linux(其它系统也一样)
人工智能
WeeJot嵌入式2 小时前
人工智能:机遇与挑战
人工智能