跳到主要内容
LangChain 快速入门指南:从基础组件到服务部署 | 极客日志
Python AI 算法
LangChain 快速入门指南:从基础组件到服务部署 综述由AI生成 LangChain 框架的核心概念与快速入门方法。内容涵盖 LangChain 的六大组件(模型、提示、索引、记忆、链、代理)、环境配置及安装步骤。详细演示了如何使用 OpenAI 模型、构建提示模板、实现输出解析、搭建向量数据库(FAISS)以及创建检索链。此外,文章还讲解了如何结合外部工具构建智能代理,并利用 LangServe 将应用部署为 REST API。通过完整代码示例,读者可掌握从基础调用到服务部署的全流程,适用于希望快速上手 LLM 应用开发的开发者。
机器人 发布于 2025/2/6 更新于 2026/6/2 22 浏览LangChain
概述
LangChain 是一个基于大语言模型(LLM)用于构建端到端语言模型应用的框架。它提供了一系列工具、套件和接口,让开发者使用语言模型来实现各种复杂的任务,如文本生成、文档问答、聊天机器人等。
LangChain 简化了 LLM 应用程序生命周期的各个阶段:
开发阶段 :使用 LangChain 的开源构建块和组件构建应用程序,利用第三方集成和模板快速启动。
生产化阶段 :使用 LangSmith 检查、监控和评估您的链,从而可以自信地持续优化和部署。
部署阶段 :使用 LangServe 将任何链转化为 API。
参考文档:https://python.langchain.com
六大核心组件
LangChain 具有六大核心组件,它们是 LangChain 的基石,相互协作形成一个强大而灵活的系统。
模型(Models) :包含各大语言模型的 LangChain 接口和调用细节,以及输出解析机制。
提示模板(Prompts) :使提示工程流线化,进一步激发大语言模型的潜力。
数据检索(Indexes) :构建并操作文档的方法,接受用户的查询并返回最相关的文档,轻松搭建本地知识库。
记忆(Memory) :通过短时记忆和长时记忆,在对话过程中存储和检索数据,让 ChatBot 记住上下文。
链(Chains) :LangChain 中的核心机制,以特定方式封装各种功能,并通过一系列的组合,自动而灵活地完成任务。
代理(Agents) :另一个 LangChain 中的核心机制,通过'代理'让大模型自主调用外部工具和内部工具,使智能 Agent 成为可能。
英文 中文 说明 Models 模型 LangChain 和大模型的接口 Chains 链 LangChain 对各种组件的封装和调用链条 Prompts 提示 输入大模型的提示模板 Indexes 索引 非结构化数据的查找和访问 Memory 记忆 与大模型聊天过程中记忆信息 Agents 代理 自主计划和执行的机制
开源库组成
LangChain 框架由以下开源库组成:
langchain-core:基础抽象和 LangChain 表达式语言。
langchain-community:第三方集成。合作伙伴包(如 langchain-openai、langchain-anthropic 等),一些集成已经进一步拆分为自己的轻量级包,只依赖于 langchain-core。
langchain:构成应用程序认知架构的链、代理和检索策略。
langgraph:通过将步骤建模为图中的边和节点,使用 LLMs 构建健壮且有状态的多参与者应用程序。
langserve:将 LangChain 链部署为 REST API。
LangSmith:一个开发者平台,可让您调试、测试、评估和监控 LLM 应用程序,并与 LangChain 无缝集成。
LangChain 基本使用
构建一个 LangChain 应用程序来熟悉该框架。
安装 LangChain 安装指定版本的 LangChain,建议安装最新稳定版。
pip install langchain langchain-openai
执行安装命令后,会自动安装相关组件,包括 langsmith、langchain-core、langchain-text-splitters 等。
pip install --upgrade langchain
安装 LangChain 时包括常用的开源 LLM(大语言模型)库:
pip install langchain[llms]
配置环境变量 安装第三方集成库,以使用 OpenAI。需要设置环境变量以认证请求。
import os
os.environ["OPENAI_BASE_URL" ] = "https://api.openai.com/v1"
os.environ["OPENAI_API_KEY" ] = "YOUR_OPENAI_API_KEY"
基本使用 from langchain_openai import ChatOpenAI
llm = ChatOpenAI()
response = llm.invoke("LangSmith 是什么?" )
print (response.content)
使用提示模板 使用提示模板来指导其响应。提示模板将原始用户输入转换为更好的 LLM 输入,有助于规范输出格式和语气。
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
llm = ChatOpenAI()
prompt = ChatPromptTemplate.from_messages([
("system" , "您是世界级的技术文档编写者。" ),
("user" , "{input}" )
])
chain = prompt | llm
response = chain.invoke({"input" : "LangSmith 如何帮助进行测试?" })
print (response.content)
虽然模型依然不知道具体答案,但对于技术作者来说,它使用了更恰当的语气给予回应。
使用输出解析器 添加一个简单的输出解析器,将聊天消息转换为字符串,便于后续处理。
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
llm = ChatOpenAI()
prompt = ChatPromptTemplate.from_messages([
("system" , "您是世界级的技术文档编写者。" ),
("user" , "{input}" )
])
output_parser = StrOutputParser()
chain = prompt | llm | output_parser
response = chain.invoke({"input" : "LangSmith 如何帮助进行测试?" })
print (response)
向量存储 加载要索引的数据,需要安装 BeautifulSoup 进行网页解析。
pip install beautifulsoup4
将其索引到向量存储中。这需要一些组件,即嵌入模型和向量存储。这里使用一个简单的本地向量存储 FAISS。
from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader("https://docs.smith.langchain.com/user_guide" )
docs = loader.load()
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs)
vector = FAISS.from_documents(documents, embeddings)
检索链 已在向量存储中索引了这些数据,接下来要创建一个检索链。该链将接收一个传入的问题,查找相关文档,然后将这些文档与原始问题一起传递给 LLM,要求它回答原始问题。
创建一个链,该链接受一个问题和检索到的文档并生成一个答案。
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("""仅根据提供的上下文回答以下问题:
<context>
{context}
</context>
Question: {input}""" )
document_chain = create_stuff_documents_chain(llm, prompt)
from langchain_core.documents import Document
text = "langsmith can let you visualize test results"
document_chain.invoke({
"input" : "LangSmith 如何帮助进行测试?" ,
"context" : [Document(page_content=text)]
})
还可以让文档首先来自刚刚设置的检索器。这样,可以使用检索器动态选择最相关的文档,并将其传递给给定的问题。
from langchain.chains import create_retrieval_chain
retriever = vector.as_retriever()
retrieval_chain = create_retrieval_chain(retriever, document_chain)
response = retrieval_chain.invoke({"input" : "how can langsmith help with testing?" })
print (response["answer" ])
对话检索链 上面创建的链只能回答单个问题。现在创建一个新链。该链将接收最新的输入和对话历史记录,并使用 LLM 生成搜索查询,以便更好地理解上下文。
from langchain.chains import create_history_aware_retriever
from langchain_core.prompts import MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages([
MessagesPlaceholder(variable_name="chat_history" ),
("user" , "{input}" ),
("user" , "鉴于上述对话,生成一个搜索查询以查找以获取与对话相关的信息" )
])
retriever_chain = create_history_aware_retriever(llm, retriever, prompt)
from langchain_core.messages import HumanMessage, AIMessage
chat_history = [HumanMessage(content="LangSmith 可以帮助测试我的 LLM 应用程序吗?" ), AIMessage(content="Yes!" )]
result = retriever_chain.invoke({
"chat_history" : chat_history,
"input" : "告诉我怎么做"
})
print (result)
还可以创建一个新的链来继续对话,并牢记这些检索到的文档。
prompt = ChatPromptTemplate.from_messages([
("system" , "根据以下上下文回答用户的问题:\n\n{context}" ),
MessagesPlaceholder(variable_name="chat_history" ),
("user" , "{input}" ),
])
document_chain = create_stuff_documents_chain(llm, prompt)
retrieval_chain = create_retrieval_chain(retriever_chain, document_chain)
chat_history = [HumanMessage(content="LangSmith 可以帮助测试我的 LLM 应用程序吗?" ), AIMessage(content="Yes!" )]
result = retrieval_chain.invoke({
"chat_history" : chat_history,
"input" : "Tell me how"
})
print (result["answer" ])
代理的使用 构建代理时要做的第一件事是确定它应该有权访问哪些工具。这里授予代理访问两个工具的权限:使用创建的检索器,以便代理能够回答有关 LangSmith 的问题;以及一个搜索工具,以使代理能够回答需要最新信息的问题。
检索器工具 from langchain.tools.retriever import create_retriever_tool
retriever = vector.as_retriever()
retriever_tool = create_retriever_tool(
retriever,
"langsmith_search" ,
"搜索有关 LangSmith 的信息。对于有关 LangSmith 的任何问题,您必须使用此工具!" ,
)
创建搜索工具 访问 Tavily 注册账号登录并创建 API 秘钥,然后配置环境变量。
import os
os.environ["TAVILY_API_KEY" ] = 'YOUR_TAVILY_API_KEY'
pip install -U langchain-community tavily-python
from langchain_community.tools.tavily_search import TavilySearchResults
search = TavilySearchResults()
创建代理 tools = [retriever_tool, search]
from langchain_openai import ChatOpenAI
from langchain import hub
from langchain.agents import create_openai_functions_agent
from langchain.agents import AgentExecutor
prompt = hub.pull("hwchase17/openai-functions-agent" )
llm = ChatOpenAI(model="gpt-3.5-turbo" , temperature=0 )
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True )
使用 Agent 代理
result = agent_executor.invoke({"input" : "Langsmith 如何帮助进行测试?" })
print (result["output" ])
result = agent_executor.invoke({"input" : "成都今天天气情况?" })
print (result["output" ])
from langchain_core.messages import SystemMessage, HumanMessage, AIMessage
chat_history = [HumanMessage(content="LangSmith 可以帮助测试我的 LLM 应用程序吗?" ), AIMessage(content="Yes!" )]
result = agent_executor.invoke({
"chat_history" : chat_history,
"input" : "告诉我怎么做"
})
print (result["output" ])
LangServe 提供服务
概述 LangServe 可以帮助开发人员将 LangChain 应用程序部署为 REST API。使用 LangChain 时不是必定使用 LangServe,但在生产环境中推荐用于标准化接口。
pip install "langserve[all]"
创建服务 创建一个 serve.py 文件。包含为应用程序提供服务的逻辑。由三部分组成:构建的链的定义、FastAPI 应用程序、为链提供服务的路由的定义,由 langserve.add_routes 命令完成。
import os
from typing import List
from fastapi import FastAPI
from langchain import hub
from langchain.agents import AgentExecutor
from langchain.agents import create_openai_functions_agent
from langchain.pydantic_v1 import BaseModel, Field
from langchain.tools.retriever import create_retriever_tool
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_community.vectorstores import FAISS
from langchain_core.messages import BaseMessage
from langchain_openai import ChatOpenAI
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langserve import add_routes
os.environ["TAVILY_API_KEY" ] = 'YOUR_TAVILY_API_KEY'
os.environ["OPENAI_BASE_URL" ] = "https://api.openai.com/v1"
os.environ["OPENAI_API_KEY" ] = 'YOUR_OPENAI_API_KEY'
loader = WebBaseLoader("https://docs.smith.langchain.com/user_guide" )
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter()
documents = text_splitter.split_documents(docs)
embeddings = OpenAIEmbeddings()
vector = FAISS.from_documents(documents, embeddings)
retriever = vector.as_retriever()
retriever_tool = create_retriever_tool(
retriever,
"langsmith_search" ,
"Search for information about LangSmith. For any questions about LangSmith, you must use this tool!" ,
)
search = TavilySearchResults()
tools = [retriever_tool, search]
prompt = hub.pull("hwchase17/openai-functions-agent" )
llm = ChatOpenAI(model="gpt-3.5-turbo" , temperature=0 )
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True )
app = FastAPI(
title="LangChain Server" ,
version="1.0" ,
description="A simple API server using LangChain's Runnable interfaces" ,
)
class Input (BaseModel ):
input : str
chat_history: List [BaseMessage] = Field(
...,
extra={"widget" : {"type" : "chat" , "input" : "location" }}
)
class Output (BaseModel ):
output: str
add_routes(
app,
agent_executor.with_types(input_type=Input, output_type=Output),
path="/agent" ,
)
if __name__ == "__main__" :
import uvicorn
uvicorn.run(app, host="localhost" , port=8000 )
启动服务 执行这个文件启动服务,并在 localhost:8000 上提供服务。
启动成功后,控制台会显示服务运行信息,并提示 Playground 地址。
服务交互 每个 LangServe 服务都带有一个简单的内置 UI,用于配置和调用具有流输出和中间步骤可见性的应用程序。
访问:http://localhost:8000/agent/playground/
设置一个客户端,以便以编程方式与我们的服务进行交互。
from langserve import RemoteRunnable
remote_chain = RemoteRunnable("http://localhost:8000/agent/" )
res = remote_chain.invoke({
"input" : "成都今天天气情况怎样?" ,
"chat_history" : []
})
print (res)
最佳实践与注意事项
安全性 :在生产环境中,切勿将 API Key 硬编码在代码中。建议使用环境变量或密钥管理服务。
性能优化 :向量存储的索引大小会影响检索速度,定期清理过期文档。
错误处理 :在 Agent 执行过程中,应捕获可能的异常,防止服务崩溃。
版本管理 :LangChain 迭代迅速,建议关注官方发布日志,及时更新依赖以避免兼容性问题。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online