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 任务的需求。

相关推荐
Raink老师6 小时前
【AI面试临阵磨枪-79】实时数据 RAG:订单、商家、物流、天气、动态库存
人工智能·面试·职场和发展
脑极体6 小时前
点亮星河AI+鸿蒙,一座艺术场馆的日神觉醒
人工智能·华为·harmonyos
Cosolar6 小时前
Chroma向量库面试学习指南
数据库·人工智能·面试·职场和发展·数据库架构
BUG指挥官6 小时前
Claude Code的自动化编程
人工智能
意图共鸣6 小时前
意图共鸣科技《认知智能白皮书》——感知与执行分离:认知架构(CA)如何重塑大模型底层结构
人工智能·架构
等一个人的@6 小时前
让数据自己开口:数睿通智库新增智能问数模块
人工智能·自然语言处理
ZGi.ai6 小时前
人工审查节点:让自动化工作流多一步人工把关
运维·人工智能·自动化·人机协同·智能体工作流·人工审查
王莎莎-MinerU7 小时前
MinerU 深度技术解析:从架构原理到生产部署的全面指南
css·人工智能·自然语言处理·架构·ocr·个人开发
盘古信息IMS7 小时前
盘古信息IMS V6 8.0重磅发布:以薪火AI数智平台点燃离散制造数智化引擎
大数据·人工智能·制造
canonical_entropy7 小时前
Harness Engineering 之外:从非线性动力系统控制理解吸引子引导工程
架构·aigc·ai编程