Skip to content

Langchain

概念

Langchain是一个用于开发由大型语言模型(LLMs)驱动的应用程序框架。 LangChain 简化了 LLM应用程序生命周期的每个阶段:

  • 开发:使用 LangChain 的开源构建模块、组件 和 第三方集成构建您的应用程序。 使用 LangGraph 构建具有一流流式处理和人机协作支持的有状态代理。
  • 生产化:使用 LangSmith 检查、监控和评估您的链,以便您可以持续优化并自信地部署
  • 部署:将您的 LangGraph 应用程序转变为生产就绪的 API和助手,使用 LangGraph Cloud

实际项目中,只会使用这个框架做开发,不会使用生产化和部署。

Langchain框架由以下开源库组成:

  • langchain-core:基础抽象和LangChain表达式(LCEL)
  • langchain-community:第三方集成。
  • 合作伙伴库(例如 langchain-openailangchain-anthropic 等):一些集成已进一步拆分为自己的轻量级库,仅依赖于langchain-core
  • langchain:组成应用程序认知架构的链、代理和检索策略。
  • LangGraph:通过将步骤建模为图中的边和节点,构建强大且有状态的多参与者应用程序。与LangChain无缝集成,但也可以单独使用。
  • LangServe:将LangChain链部署为REST API。
  • LangSmith:一个开发者平台,让您调试、测试、评估和监控LLM应用程序。

LangChain表达式(LCEL)

LCEL的全称是LangChain Expression Language。其实他的用处就是使用“|”运算符 链接LangChain应用的各个组件。

是一种声明式的方法来链接LangChain组件。LCEL 从第一天起就被设计为支持将原型投入生产,无需代码更改,从最简单的“提示词 +大型语言模型”链到最复杂的链(我们看到有人成功在生产环境中运行包含数百个步骤的LCEL链)。

LCEL的各种语法

  • Runnable节点
  • 节点调用、批量、流式运行
  • 组合成chain
  • 并行调用运行
  • 合并输入和输出字典
  • 后备选项
  • 重复多次执行Runnable节点
  • 条件构建chain
  • map高阶处理
  • 打印chain图形
  • 生命周期管理

体验

开发时需要安装的库

txt
langchain
langchain-openai
langchain-community
LangGraph

使用langchain调用AI大模型

python
from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="GLM-4.5-Flash",
    temperature=1,
    openai_api_key='',
    openai_api_base=''
)
prompt = [
        SystemMessage('请把下面的语句翻译为日语'), # 内部大括号表示定义参数
		HumanMessage('今天天气怎么样?')
	]
parser = StrOutputParser() # 解析相应对象为字符串

# 第一种写法
res = llm.invoke(prompt)
parser.invoke(res)
print(res)
print(parser)

使用链式语法

python
# 提示词模板
prompt = ChatPromptTemplate.from_messages(
	[
        ('system', '请把下面的语句翻译为{language}'), # 内部大括号表示定义参数
        ('user', '{user_text}')
	]
)

parser = StrOutputParser() # 解析相应对象为字符串

# LCEL
chain = prompt | llm | parser

print(chain.invoke({'language': '日文', 'user_text': '你吃饭了吗?'}))

基于上下文对话

上下文记录必须存储在本地,并且要存放到磁盘当中,也就是数据库中。

python
parser = StrOutputParser()

prompt = ChatPromptTemplate.form_messages([
    ('system', '你是一个幽默的程序员'),
    MessagesPlaceholder(variable_name='history'), # 上下文记录
    ('user', '{input}')
])

chain = prompt | llm | parser

# 把聊天记录保存到数据库中
def get_session_history(sid):
    """根据会话ID,读取和保存历史记录,必须返回BaseChatMessageHistory类型"""
    return SQLCHatMessageHistory(sid, '数据库连接')

runnable = RunnableWithMessageHistory(
	chain,
    get_session_history,
    input_messages_key='input',
    history_message_key='history'
)

# 调用
res1 = runnable.invoke({'input': '中国一共有哪些直辖市'}, config={'configurable': {'session_id': 'zijideid111'}})
res2 = runnable.invoke({'input': '这些城市中哪个最大'}, config={'configurable': {'session_id': 'zijideid111'}})

print(res1)
print('--'*30)
print(res2)

Released under the MIT License.