【开发者速递】30分钟上手LangChain:零基础构建你的首个AI翻译引擎

无需机器学习背景,解锁大语言模型(LLM)的核心力量!
本文将带您使用LangChain框架,快速搭建一个轻量级多语言翻译工具。虽然代码不多,却能完整呈现LLM应用的工业化开发逻辑——从提示词工程到模块化编排,体验利用deepseek api开发的最佳实践。


教程亮点

✨ 直击LLM开发本质:单次模型调用+智能提示设计=实用AI工具
✨ LangChain核心技能三连击

  • 语言模型(LLM)的标准化调用

  • 动态提示模板(PromptTemplate)的魔力

  • 用LCEL语言实现「乐高式」组件


核心知识点全景

1️⃣ 语言模型的API化思维

  • 如何将DeepSeek模型转化为即插即用的翻译引擎

2️⃣ 提示词工程的进阶技巧

  • 结构化提示模板:告别杂乱无章的文本拼接

  • OutputParser:让AI的输出始终符合程序规范

3️⃣ LCEL的管道哲学

  • 用「|」运算符实现数据处理流水线


一、安装环境:pip install langchain,等环境配置

# 小试牛刀

首先,我们将学习如何单独调用语言模型。LangChain 框架支持多种不同的语言模型,这些模型可以灵活互换使用。在本示例中,我们选择使用 DeepSeek 模型。

from langchain.chains import LLMChain
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage

# 替换为你的DeepSeek API Key
deepseek_api_key = "your-deepseek-api"

# 创建Chat模型实例
model = ChatOpenAI(
    model_name="deepseek-chat",  # 根据DeepSeek文档确认具体模型名称
    openai_api_base="https://api.deepseek.com/v1",  # 根据官方文档确认API地址
    openai_api_key=deepseek_api_key,
    streaming=False,
    verbose=True
)

# 构建对话消息
messages = [
    HumanMessage(content="Hi! I'm Sven"),
]

# 要简单地调用模型,我们可以将消息列表传递给. invoke方法
response = model.invoke(messages)
print(response)
content='Hi Sven! 👋 Nice to meet you! How can I help you today? 😊' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 20, 'prompt_tokens': 9, 'total_tokens': 29, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}, 'prompt_cache_hit_tokens': 0, 'prompt_cache_miss_tokens': 9}, 'model_name': 'deepseek-chat', 'system_fingerprint': 'fp_3d5141a69a_prod0225', 'id': '5f691b6f-59c0-4ba4-b6d4-abb1c114d557', 'finish_reason': 'stop', 'logprobs': None} id='run-e08a424c-f0d7-419a-a2c4-084f5af9a8ca-0' usage_metadata={'input_tokens': 9, 'output_tokens': 20, 'total_tokens': 29, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}}

LangChain 将语言模型封装为 "Runnables" 接口的实例(例如 ChatModels),这意味着所有模型都遵循统一的交互标准。要调用模型,只需将消息列表传递给 .invoke() 方法即可。

messages = [
    SystemMessage(content="将以下内容从英文翻译成中文"),
    HumanMessage(content="hi!"),
]

model.invoke(messages)
AIMessage(content='你好!😊', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 4, 'prompt_tokens': 13, 'total_tokens': 17, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}, 'prompt_cache_hit_tokens': 0, 'prompt_cache_miss_tokens': 13}, 'model_name': 'deepseek-chat', 'system_fingerprint': 'fp_3d5141a69a_prod0225', 'id': 'b4b9766d-dd71-471f-964a-1249bb5c6f57', 'finish_reason': 'stop', 'logprobs': None}, id='run-4896100b-1dd3-4636-bc43-cb45f62930d2-0', usage_metadata={'input_tokens': 13, 'output_tokens': 4, 'total_tokens': 17, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}})

#  OutputParsers

模型的输出是一个 AIMessage 对象,其中包含:

  • 字符串形式的响应内容
  • 其他元数据信息

通常,我们只需要提取字符串响应部分。为此,可以使用简单的输出解析器来提取该内容。

  1. 导入解析器:首先引入简单输出解析器模块。
  2. 独立使用解析器:解析器可单独调用,无需依赖其他上下文。例如:先保存语言模型的调用结果(AIMessage 对象),再将其传递给解析器以提取字符串响应。
from langchain_core.output_parsers import StrOutputParser

parser = StrOutputParser()
# 可以单独使用它
result = model.invoke(messages)

parser.invoke(result)
# '你好!'

更常见的做法是将语言模型与输出解析器“链式组合”。在这种链式结构中,每次调用模型时都会自动触发解析器,即:模型接收输入(字符串或消息列表),解析器处理模型输出并返回最终结果(字符串)。

在 LangChain 中,可通过 | 操作符快速构建这种链式调用。| 操作符用于将两个组件(如模型与解析器)按顺序组合,实现数据流的自动传递。

chain = model | parser

chain.invoke(messages)
# '你好!'

# Prompt Templates

目前,我们直接将消息列表传递给语言模型。那么,这个消息列表是如何生成的呢?
通常,它由用户输入和应用程序逻辑共同构建

  1. 用户输入:原始的用户文本(如问题、指令等)。
  2. 应用程序逻辑:负责将用户输入转换为符合语言模型要求的消息列表。

常见的转换逻辑包括:

  • 添加系统消息:在消息列表中插入预设的系统提示(如角色设定、任务说明)。
  • 格式化模板:根据用户输入填充预定义的模板(如问答模板、任务指令模板)。

PromptTemplates 是 LangChain 中设计用于帮助此转换的概念。它们接收原始用户输入并返回准备传递给语言模型的数据(提示)。

让我们在此处创建一个 PromptTemplate。它将接受两个用户变量:要将文本翻译成的语言、要翻译的文本。示例实现步骤:
  1. 创建系统消息
    首先,定义一个字符串并格式化为系统消息(例如角色设定)。
  2. 构建 PromptTemplate
    使用 PromptTemplate 将系统消息模板与用户输入模板组合,生成最终的消息列表。
from langchain_core.prompts import ChatPromptTemplate
system_template = "将以下内容翻译成{language}:"
# 创建 PromptTemplate
prompt_template = ChatPromptTemplate.from_messages(
    [("system", system_template), ("user", "{text}")]
)

这个提示模板的输入是字典。我们可以自己玩这个提示模板,看看它自己做了什么

result = prompt_template.invoke({"language": "italian", "text": "nice to meet you!"})

result
ChatPromptValue(messages=[SystemMessage(content='将以下内容翻译成italian:', additional_kwargs={}, response_metadata={}), HumanMessage(content='nice to meet you!', additional_kwargs={}, response_metadata={})])

我们可以看到它返回一个由两条消息组成的ChatPromptValue。如果我们想直接访问消息,我们会这样做:

result.to_messages()
[SystemMessage(content='将以下内容翻译成italian:', additional_kwargs={}, response_metadata={}),
 HumanMessage(content='nice to meet you!', additional_kwargs={}, response_metadata={})]

# Chaining together components with LCEL

我们现在可以使用管道操作符 | 将其与上述模型和输出解析器结合起来:

chain = prompt_template | model | parser

chain.invoke({"language": "italian", "text": "nice to meet you!"})
# 'Piacere di conoscerti!'

这是使用 LangChain Expression Language (LCEL) 链接 LangChain 模块的一个简单示例。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐