Langchain
概念
Langchain是一个用于开发由大型语言模型(LLMs)驱动的应用程序框架。 LangChain 简化了 LLM应用程序生命周期的每个阶段:
- 开发:使用 LangChain 的开源
构建模块、组件 和 第三方集成构建您的应用程序。 使用LangGraph构建具有一流流式处理和人机协作支持的有状态代理。 - 生产化:使用
LangSmith检查、监控和评估您的链,以便您可以持续优化并自信地部署 - 部署:将您的 LangGraph 应用程序转变为生产就绪的 API和助手,使用
LangGraph Cloud。
实际项目中,只会使用这个框架做开发,不会使用生产化和部署。
Langchain框架由以下开源库组成:
langchain-core:基础抽象和LangChain表达式(LCEL)langchain-community:第三方集成。- 合作伙伴库(例如
langchain-openai、langchain-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)