langchain快速入门:基本组件介绍和快速搭建服务
1. 模型组件
load_dotenv()
llm = ChatOpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url=os.getenv("BASE_URL"),
model=os.getenv("LLM_MODEL"),
temperature=0.1,
)
text ="你是谁?"
messages = [HumanMessage(content = text)]
if __name__ =="__main__":
# LLM模型组件:输入为字符串
# print(llm.invoke(text))
# CHAT MODEL模型组件
print(llm.invoke(messages))
LangChain 将大语言模型抽象为两种调用方式:
- LLM 接口:接受纯字符串输入,适合简单文本生成场景。底层调用的是模型的
completion端点。 - Chat Model 接口:接受结构化消息列表(
SystemMessage/HumanMessage/AIMessage),更适合对话场景。底层调用的是模型的chat.completion端点。
💡 选型建议:现代模型(GPT-4、通义千问、Claude 等)普遍基于 Chat API 设计,建议优先使用
ChatOpenAI而非 legacy 的LLM类。
2. 提示词模板组件
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
from langchain_core.prompts import PromptTemplate
from langchain_core.prompts import ChatPromptTemplate
load_dotenv()
llm = ChatOpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url=os.getenv("BASE_URL"),
model=os.getenv("LLM_MODEL"),
temperature=0.1,
)
#自动将用户的输入转换为完整的格式化提示词
prompt = PromptTemplate.from_template("猫得了{disease}怎么办?")
prompt_1=prompt.format(disease = "拉肚子")
#细化每条消息的具体消息,比如角色和列表中的位置
template ="你是一个宠物医疗AI助手"
human_template = "我的宠物{pet_type}名为{name},出现{symptoms}"
chat_prompt = ChatPromptTemplate.from_messages([
("system",template),
("human",human_template),
])
prompt_2 = chat_prompt.format_messages(pet_type = "猫",name="臭臭", symptoms = "牙结石")
if __name__ =="__main__":
print("*"*50)
print(llm.invoke(prompt_1))
print("*" * 50)
print(llm.invoke(prompt_2))
LangChain 提供了两种提示词模板,分别对应不同的交互模式:
| 模板类型 | 适用场景 | 特点 |
|---|---|---|
PromptTemplate | 单轮指令/文本生成 | 字符串模板,通过 .format() 注入变量,输出为字符串 |
ChatPromptTemplate | 多轮对话/角色扮演 | 消息列表模板,支持 system/human/ai 角色定义,输出为消息对象列表 |
关键区别:
PromptTemplate解决的是**“如何优雅地拼接字符串”**——避免在代码里硬编码大量提示词文本。ChatPromptTemplate解决的是**“如何结构化地管理对话上下文”**——通过角色标签让模型明确区分系统指令和用户输入,显著提升指令遵循的稳定性。
3. 输出解析器组件 / 使用 LCEL 进行组合
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import BaseOutputParser
from typing import List
load_dotenv()
llm = ChatOpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url=os.getenv("BASE_URL"),
model=os.getenv("LLM_MODEL"),
temperature=0.1,
)
class CommaSeperatedListOutputParser(BaseOutputParser[List[str]]):
def parse(self, text:str)-> List[str]:
return text.strip().split(",")
template ="""
你是一个智能ai医疗助手,用户会传入一个宠物的症状,你应该生成该症状下的3种药品(中文名),并以英文逗号分分隔的形式返回.
只返回以逗号分隔的内容,不要返回其他内容。
"""
human_template = "{text}"
chat_prompt = ChatPromptTemplate.from_messages([
("system", template),
("human",human_template)
])
if __name__ =="__main__":
chain = chat_prompt | llm | CommaSeperatedListOutputParser()
print("*"*50)
print(chain.invoke({"text":"猫咪软便"}))
print("*" * 50)
LCEL(LangChain Expression Language)是 LangChain 的管道编排语法,用 | 运算符将组件串联成可执行的数据流。
本例的数据流转过程:
用户输入 {"text": "猫咪软便"}
↓
chat_prompt 渲染为结构化消息 → [SystemMessage, HumanMessage]
↓
llm 调用模型生成文本 → "蒙脱石散,益生菌,克痢肽"
↓
CommaSeperatedListOutputParser 解析 → ["蒙脱石散", "益生菌", "克痢肽"]
为什么要自定义输出解析器?
模型本质上输出的是非结构化文本。输出解析器的作用是将文本转换为结构化数据(如列表、字典、Pydantic 对象),方便下游程序直接消费。这是构建可靠 AI 应用的关键环节——"提示词要求模型按格式输出"只是软性约束,解析器则提供了硬性的数据校验和转换。
4. 使用 LangSmith 观测

LangSmith 是 LangChain 官方提供的 LLM 应用可观测性平台,核心价值在于解决大模型应用的"黑盒"问题:
- Trace 追踪:可视化展示 Chain 中每一步的输入输出、Token 消耗、延迟耗时
- 调试排错:当输出不符合预期时,可逐层检查是提示词渲染错误、模型理解偏差还是解析器逻辑问题
- 数据沉淀:自动收集生产环境的调用记录,为后续迭代提供高质量的标注数据
配置方式:在环境变量中设置
LANGCHAIN_API_KEY和LANGCHAIN_PROJECT,无需修改代码即可自动接入。
5. 使用 LangServe 提供服务
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import BaseOutputParser
from typing import List
from langserve import add_routes
from fastapi import FastAPI
load_dotenv()
llm = ChatOpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url=os.getenv("BASE_URL"),
model=os.getenv("LLM_MODEL"),
temperature=0.1,
)
class CommaSeperatedListOutputParser(BaseOutputParser[List[str]]):
def parse(self, text:str)-> List[str]:
return text.strip().split(",")
template ="""
你是一个智能ai医疗助手,用户会传入一个宠物的症状,你应该生成该症状下的3种药品(中文名),并以英文逗号分分隔的形式返回.
只返回以逗号分隔的内容,不要返回其他内容。
"""
human_template = "{text}"
chat_prompt = ChatPromptTemplate.from_messages([
("system", template),
("human",human_template)
])
app = FastAPI(
title = "宠物医疗助手v1",
version = "0.0.1",
description = "Langchain应用接口"
)
first_chain = chat_prompt | llm | CommaSeperatedListOutputParser()
add_routes(app,first_chain,path = "/first_app")
if __name__ =="__main__":
import uvicorn
uvicorn.run(app,host="localhost",port=8000)
LangServe 是 LangChain 的部署工具,核心能力是将 LCEL Chain 一键转换为 FastAPI 服务。
它自动完成以下工作:
| 能力 | 说明 |
|---|---|
| 路由注册 | 将 Chain.invoke 映射为 HTTP POST 接口 |
| 输入校验 | 基于 Chain 的输入 Schema 自动生成 Pydantic 校验 |
| 文档生成 | 自动生成 OpenAPI 文档和交互式 Playground |
| 流式支持 | 原生支持 stream / astream 等异步流式接口 |
访问路径:
- API 端点:
POST http://localhost:8000/first_app/invoke - 调试界面:
http://localhost:8000/first_app/playground/

⚠️ 注意:
add_routes会自动暴露invoke、batch、stream等多个端点,生产环境建议通过enable_feedback_endpoint等配置进行访问控制。
好了,以下就是今天介绍的所有内容,本文仅仅简单介绍了基本组件介绍和快速搭建服务
1703



被折叠的 条评论
为什么被折叠?



