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

相关推荐
panpantt321几秒前
【参会邀请】第二届大数据与数据挖掘国际会议(BDDM 2024)邀您相聚江城!
大数据·人工智能·数据挖掘
lindsayshuo9 分钟前
jetson orin系列开发版安装cuda的gpu版本的opencv
人工智能·opencv
向阳逐梦9 分钟前
ROS机器视觉入门:从基础到人脸识别与目标检测
人工智能·目标检测·计算机视觉
陈鋆34 分钟前
智慧城市初探与解决方案
人工智能·智慧城市
qdprobot35 分钟前
ESP32桌面天气摆件加文心一言AI大模型对话Mixly图形化编程STEAM创客教育
网络·人工智能·百度·文心一言·arduino
QQ395753323735 分钟前
金融量化交易模型的突破与前景分析
人工智能·金融
QQ395753323736 分钟前
金融量化交易:技术突破与模型优化
人工智能·金融
The_Ticker1 小时前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
Elastic 中国社区官方博客1 小时前
Elasticsearch 开放推理 API 增加了对 IBM watsonx.ai Slate 嵌入模型的支持
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
jwolf21 小时前
摸一下elasticsearch8的AI能力:语义搜索/vector向量搜索案例
人工智能·搜索引擎