langchain教程01:构建简单的LLM应用程序(deepseek api)
【开发者速递】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对象,其中包含:
- 字符串形式的响应内容
- 其他元数据信息
通常,我们只需要提取字符串响应部分。为此,可以使用简单的输出解析器来提取该内容。
- 导入解析器:首先引入简单输出解析器模块。
- 独立使用解析器:解析器可单独调用,无需依赖其他上下文。例如:先保存语言模型的调用结果(
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
目前,我们直接将消息列表传递给语言模型。那么,这个消息列表是如何生成的呢?
通常,它由用户输入和应用程序逻辑共同构建:
- 用户输入:原始的用户文本(如问题、指令等)。
- 应用程序逻辑:负责将用户输入转换为符合语言模型要求的消息列表。
常见的转换逻辑包括:
- 添加系统消息:在消息列表中插入预设的系统提示(如角色设定、任务说明)。
- 格式化模板:根据用户输入填充预定义的模板(如问答模板、任务指令模板)。
PromptTemplates 是 LangChain 中设计用于帮助此转换的概念。它们接收原始用户输入并返回准备传递给语言模型的数据(提示)。
让我们在此处创建一个 PromptTemplate。它将接受两个用户变量:要将文本翻译成的语言、要翻译的文本。示例实现步骤:
- 创建系统消息:
首先,定义一个字符串并格式化为系统消息(例如角色设定)。 - 构建 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 模块的一个简单示例。
更多推荐


所有评论(0)