Langchain快速入门

langchain的官方地址: LangChain

API的地址: LangChain Python API Reference — 🦜🔗 LangChain documentation(这里面可以看到不同厂家的大模型在langchain该如何去调用其api和langchain提供的封装功能的api接口)

学习langchain需要注意的几个点:

  • LangChain 也是一套面向大模型的开发框架(SDK)
  • LangChain 是 AGI 时代软件工程的一个探索和原型
  • 学习 LangChain 要关注接口变更

langchain主要由三部分构成:

  • Build:使用 LangChain 构建应用
  • Run:使用 LangGraph Platform 大规模运行
  • Manage:使用 LangSmith 管理 LLM 性能

langchain和langgraph:

  • LangChain: LLM 构建的可组合框架
  • LangGraph:可控代理工作流的编排框架。

langchain的核心主件

1. 模型 I/O 封装

  • LLMs:大语言模型
  • Chat Models:一般基于 LLMs,但按对话结构重新封装
  • PromptTemple:提示词模板
  • OutputParser:解析输出

2. 数据连接封装

  • Document Loaders:各种格式文件的加载器
  • Document Transformers:对文档的常用操作,如:split(分割)、filter(过滤)、translate(翻译)、extract metadata(提取元数据)等
  • Text Embedding Models:文本向量化表示,用于检索等操作
  • Vectorstores:(面向检索的)向量的存储
  • Retrievers:向量的检索

3. 对话历史管理

  • 对话历史的存储、加载与剪裁

4. 架构封装

  • Chain(链):实现一个功能或者一系列顺序功能组合
  • Agent(工具):根据用户输入,自动规划执行步骤,自动选择每步需要的工具,最终完成用户指定的功能
    • Tools:调用外部功能的函数,例如:调 Google 搜索、文件 I/O、Linux Shell 等
    • Toolkits:操作某软件的一组工具集,例如:操作数据库、操作 Gmail 等

内容分析

  1. 模型 I/O 封装:
    • 涉及大语言模型(LLMs)、对话模型(Chat Models)、提示词模板(PromptTemple)和输出解析(OutputParser)。
  1. 数据连接封装:
    • 包括文档加载、转换、文本向量化、向量存储和检索等功能。
  1. 对话历史管理:
    • 管理对话历史的存储、加载和剪裁。
  1. 架构封装:
    • 通过 Chain 和 Agent 实现功能组合和自动化任务执行,支持调用外部工具和操作特定软件。


LangChain 相关资源链接

  1. 功能模块:https://python.langchain.com/docs/get_started/introduction
  2. API 文档:LangChain Python API 参考 — 🦜🔗 LangChain 文档
  3. 三方组件集:https://python.langchain.com/docs/integrations/platforms/
  4. 官方应用案例:Use cases | 🦜️🔗 LangChain
  5. 调试部署等指导:Debugging | 🦜️🔗 LangChain

以下是代码的一些操作:

第一节: 模型 I/O 封装

  • 把不同的模型统一封装成一个接口,方便更换模型而不用重构代码。

1.1 模型 API:LLM vs. ChatModel

  • LLM:大语言模型
  • ChatModel:基于 LLM 的对话模型

安装依赖

pip install --upgrade langchain 
pip install -U langchain-deepseek
pip install --upgrade langchain-community

1.1.1 DeepSeek 模型封装

# 导入模型 
from langchain_deepseek import ChatDeepSeek 
# 初始化 deepseek 模型,需要提前为设置deepseek的api_key全局环境, 
# 具体如何设置可到langchain官网API文档查看,提供了各个大模型的设置方法
llm = ChatDeepSeek(model="deepseek-reasoner") 
if __name__ == "__main__": 
response = llm.invoke("你是谁")  # 调用模型
print(response.content)


1.1.2 多轮对话 Session 封装

from langchain.schema import (
    AIMessage,  # 等价于 OpenAI 接口中的 assistant role
    HumanMessage,  # 等价于 OpenAI 接口中的 user role
    SystemMessage  # 等价于 OpenAI 接口中的 system role
)  # 导入模型
from deepseek import llm

# 定义多轮对话消息
if __name__ == "__main__":
    messages = [
        SystemMessage(content="你是同欣AI的课程助理。"),  # 设定助手的角色。
        HumanMessage(content="我是学员,我叫大拿。"),  # 用户输入,介绍自己
        AIMessage(content="欢迎!"),  # 助手的回复
        HumanMessage(content="我是谁")  # 用户的提问
    ]

# 调用模型进行多轮对话
    ret = llm.invoke(messages)
    print(ret.content)


  1. Format:展示了如何将变量x 和 y 插入到模板字符串中,生成具体的句子。
    • 示例:"Does foo like bar, and why?"。
  1. Predict:使LLM(大语言模型)或 Chat Model(对话模型)进行预测。
  2. Parse:输出需要格式的内容(如json)

1.2.1 Prompt 模板封装

创建PromptTemplate类模板

#从 langchain.prompts 模块导入 PromptTemplate 类
from langchain.prompts import PromptTemplate

# 创建 PromptTemplate 对象
template = PromptTemplate.from_template("给我讲个关于{subject}的笑话")
#使用 PromptTemplate.from_template 方法创建一个模板,模板中包含一个变量 {subject}

if __name__ == '__main__':
    # 打印模板
    print("===Templates==")
    print(template)

    # 格式化模板并打印
    print("===Prompts==")
    print(template.format(subject='小明'))

使用模板

from deepseek import llm

if __name__ == '__main__':
# 通过 Prompt 调用 LLM
#使用template.format(subject='小明') 格式化提示词模板,生成具体的提示词。
#调用llm.invoke 方法,将格式化后的提示词传递给模型,获取模型的响应。
    ret = llm.invoke(template.format(subject='小明'))
    
    # 打印输出
    print(ret.content)

创建ChatPromptTemplate类模板

from langchain.prompts import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
    SystemMessagePromptTemplate,
) 
from deepseek import llm 
if __name__ == '__main__': 
#使用ChatPromptTemplate.from_messages 创建一个多角色提示词模板。
#包含两条消息:
#SystemMessagePromptTemplate:系统消息,定义助手的角色和名字。
#HumanMessagePromptTemplate:用户消息,定义用户的查询。 
template = ChatPromptTemplate.from_messages(
        [
            SystemMessagePromptTemplate.from_template("你是{product}的客服助手。你的名字叫{name}"),
            HumanMessagePromptTemplate.from_template("{query}"),
        ]
    ) 
# 格式化提示词
prompt = template.format_messages(
        product="同欣AI研究院",
        name="大吉",
        query="你是谁"
    ) 
# 使用 template.format_messages 格式化提示词模板,传入具体的参数 
# 打印格式化后的提示词
    print(prompt) 
# 调用 LLM
ret = llm.invoke(prompt)
# 打印模型输出 
print(ret.content)


3. MessagesPlaceholder 把多轮对话变成模板

定义ChatPromptTemplate类模板

from langchain.prompts import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
    MessagesPlaceholder,
)

# 定义用户消息模板
human_prompt = "Translate your answer to {language}."
human_message_template = HumanMessagePromptTemplate.from_template(human_prompt)

# 定义 ChatPromptTemplate
chat_prompt = ChatPromptTemplate.from_messages(
    [
        # 使用 MessagesPlaceholder 占位符,表示多轮对话历史
        # MessagesPlaceholder是一个占位符,用于在模板中插入多轮对话历史。
        # variable_name="history"指定了占位符的变量名,后续可以通过 history 变量传入多轮对话历史。
        MessagesPlaceholder(variable_name="history"),
        # 添加用户消息模板
        human_message_template
    ]
)

传入多轮历史对话形成多轮对话模板并调用大模型生成对话

from langchain_core.messages import AIMessage, HumanMessage
from deepseek import llm
from messages_placeholder import chat_prompt

if __name__ == '__main__':
# 定义用户消息和 AI 消息(历史对话)
    human_message = HumanMessage(content="Who is Elon Musk?")
    ai_message = AIMessage(
        content="Elon Musk is a billionaire entrepreneur, inventor, and industrial designer"
    )

# 格式化提示词,加传入历史对话和参数
    messages = chat_prompt.format_prompt(
        # 对 "history" 和 "language" 赋值
        history=[human_message, ai_message],
        language="中文"
    )

# 打印格式化后的消息
    print(messages.to_messages())

# 调用 LLM
    result = llm.invoke(messages)
    print(result.content)


以上都是一些写死的Prompt模板,下面我们来看如何从文件中加载提示词模板

1.2.2 从文件加载 Prompt 模板

from langchain.prompts import PromptTemplate

# 从文件加载 Prompt 模板
# 传入文件的路径和编码格式
template = PromptTemplate.from_file("../prompt/example_prompt_template", encoding='utf-8')

# 打印模板
print("===Template===")
print(template)

# 格式化模板并打印
print("===Prompt===")
print(template.format(topic='黑色幽默'))# 传入参数

后续还会继续更新。

AI/BI
Langchain快速入门
刘付国瑞 2025年3月22日
分析这篇文章

存档
登录 留下评论
部署RAGFlow + Vanna