背景与问题
langcain是一个开源的python库,封装了简化大模型操作的api,提供了统一的接口,方便开发者使用。本文主要是记录常用的api及其用法。
核心
连接大模型的api
- init_chat_model
- ChatOpenAI
- 各个厂商自己的api
第一种方式是使用init_chat_model初始化大模型,返回一个chat_model对象,国内的模型model_provider默认是openai,需要提供api_key和base_url来区分。
# 百炼平台大模型链接 llm_client from langchain.chat_models import init_chat_model = init_chat_model( model="qwen3-max-2026-01-23", api_key=os.getenv("DASHSCOPE_API_KEY"), model_provider="openai", base_url="https://dashscope.aliyuncs.com/compatible-mode/v1" )
其次遵循openai规范的大模型使用ChatOpenAI这个api可以连接,无需提供给model_provider参数。
llm_client_ofrom langchain_openai import ChatOpenAI
penai = ChatOpenAI(
model="qwen3-max-2026-01-23",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
最后的各个厂商都有自己的api在langchain社区封装的,如: 百炼大模型的
from langchain_community.chat_models.tongyi import ChatTongyi
llm_dashscope = ChatTongyi(
model="qwen3-max-2026-01-23",
api_key=os.getenv("DASHSCOPE_API_KEY"),
)
agents智能体
智能体是集成了大模型,工具和中间件等组件的一个对象,用于执行任务。
agent = create_agent(
model = llm_client,
tools = [get_weather, get_location],
system_prompt="你是一个生活助手,耐心回答用户问题",
middleware=[
logger,
# 摘要中间键
SummarizationMiddleware(
model=llm_client,
keep=("messages", 20),
trigger=("tokens", 4000),
)
]
)
PromptTemplate
from langchain_core.prompts import PromptTemplate
# 定义一个包含变量的模板
template = "你是一名{role}工程师,请帮我设计{feature}的单元测试用例"
prompt = PromptTemplate(
input_variables=["role", "feature"],
template=template
)
# 格式化生成最终的提示字符串
formatted_prompt = prompt.format(role="资深测试", feature="条件覆盖")
print(formatted_prompt)
# 输出: 你是一名资深测试工程师,请帮我设计条件覆盖的单元测试用例
# 或者直接使用from_template
# prompt = PromptTemplate.from_template("你是一名{role}, 现在请{feature}")
# format_prompt = prompt.format(role="历史专家", feature="介绍刘备")
# print(format_prompt)
ChatPromptTemplate
用于多轮对话 有from_messages和 from_template两个方法,
from_messages接收一个消息列表,每个消息是一个元组,第一个元素是消息的角色,第二个元素是消息的内容。
from_template接收的是一个模板字符串,模板字符串中可以包含变量,变量用大括号{}括起来。
from langchain_core.prompts import ChatPromptTemplate
from model import llm_client
prompt = ChatPromptTemplate.from_messages( [
("system", "你是一个{role}"),
("human", "请帮我{feature}")
])
res = llm_client.invoke(prompt.format(role="历史专家", feature="介绍秦始皇"))
print(res)
DocumentLoaders
文档加载器用于加载文档,将文档转换为langchain的文档对象。
from langchain_community.document_loaders import TextLoader
# 加载文本 转为document对象
loader = TextLoader("../docs/deepseek-intro.txt")
document = loader.load()
print(document)
langchain_community还提供了很多了loader 如 PyPDFLoader、Docx2txtLoader、WebBaseLoader等
文档分块
langchain里的切割器有哪些?
-
CharacterTextSplitter 按字符切割文档,默认是按换行符切割。
-
RecursiveCharacterTextSplitter 递归按字符切割文档,默认是按换行符切割。
- TokenTextSplitter
按token切割文档,token切分不需要大模型参与,而是使用了本地的tokenizer,只要设置encoding_name即可
如:
from langchain.text_splitter import TokenTextSplitter text_splitter = TokenTextSplitter(encoding_name="cl100k_base")这些编码器都是本地的,不需要 API
TokenTextSplitter(encoding_name=”cl100k_base”) # GPT-3.5/4 的 tokenizer TokenTextSplitter(encoding_name=”p50k_base”) # GPT-3 的 tokenizer TokenTextSplitter(encoding_name=”r50k_base”) # GPT-2 的 tokenizer TokenTextSplitter(model_name=”gpt-3.5-turbo”) # 自动选择 cl100k_base
- MarkdownTextSplitter 按markdown语法切割文档
其他还有:
"CharacterTextSplitter",
"ElementType",
"ExperimentalMarkdownSyntaxTextSplitter",
"HTMLHeaderTextSplitter",
"HTMLSectionSplitter",
"HTMLSemanticPreservingSplitter",
"HeaderType",
"JSFrameworkTextSplitter",
"KonlpyTextSplitter",
"Language",
"LatexTextSplitter",
"LineType",
"MarkdownHeaderTextSplitter",
"MarkdownTextSplitter",
"NLTKTextSplitter",
"PythonCodeTextSplitter",
"RecursiveCharacterTextSplitter",
"RecursiveJsonSplitter",
"SentenceTransformersTokenTextSplitter",
"SpacyTextSplitter",
"TextSplitter",
"TokenTextSplitter",
"Tokenizer",
"split_text_on_tokens",