如何使用LangChain
欢迎来到Agent开发的瑞士军刀——LangChain!🔗✨
LangChain是什么?
LangChain是一个强大的框架,专为开发由语言模型驱动的应用而设计。它提供了一套标准化的接口、组件和工具,让你可以轻松构建复杂的AI应用和Agent,而不必从头开始编写所有基础代码。
如果把OpenAI API比作是一块CPU,那么LangChain就是一台预装了操作系统和常用软件的完整电脑!
为什么使用LangChain?
想象你正在搭建一座房子。你可以自己从头制作每一块砖、每根电线和每个水管,但那太费时间了!LangChain就像是提供了预制构件,让你能快速组装出功能完整的房子:
- 不重复造轮子:常见功能已经打包好了
- 模块化设计:像乐高一样组合不同功能
- 抽象底层复杂性:关注业务逻辑而非技术细节
- 多模型支持:轻松切换不同的LLM提供商
安装与设置
别忘了配置你的API密钥:
import os
os.environ["OPENAI_BASE_URL"] = "https://oneapi.handbook.cool/v1"
os.environ["OPENAI_API_KEY"] = "sk-XnbHbzBOmPYGHgL_8q1nHn9pF7SRIQO-3M0QhYcpYAmV3kxQJ7SiqbzfETE"
LangChain核心概念
1. 模型(Models)
LangChain 支持多种语言模型,包括 OpenAI 的 GPT 系列、Anthropic 的 Claude 系列等。这些模型通过统一的接口与 LangChain 进行集成,使得开发者可以轻松地切换和对比不同的模型。
from langchain_openai import ChatOpenAI
# OpenAI模型
gpt = ChatOpenAI(model="gpt-4.1-nano")
# deepseek模型
deep = ChatOpenAI(model="deepseek-chat")
# 使用相同的接口调用不同模型
response_gpt = gpt.invoke("Python中如何读取CSV文件?")
# 使用相同的接口调用不同模型
response_deep = deep.invoke("Python中如何读取CSV文件?")
2. 提示模板(Prompts)
提示词(Prompt)是引导模型生成预期输出的关键工具。LangChain 提供了灵活的提示词模板,开发者可以设计复杂的提示逻辑,以满足不同的应用需求。
from langchain.prompts import ChatPromptTemplate
# 创建提示模板
prompt = ChatPromptTemplate.from_template("""
你是一位{专业领域}专家。请回答以下问题:
{问题}
请用{语言}回答,并保持{风格}的风格。
""")
# 填充模板变量
formatted_prompt = prompt.format(
专业领域="机器学习",
问题="决策树和随机森林有什么区别?",
语言="中文",
风格="简洁专业"
)
# 发送到模型
response = gpt.invoke(formatted_prompt)
print(response.content)
3. 链(Chains)
将多个组件连接起来,形成处理流程:
from langchain.prompts import PromptTemplate
# 创建提示模板
template = """
你是一个有用的AI助手。用户说: {user_input}
请用简洁友好的方式回应。
"""
prompt = PromptTemplate(template=template, input_variables=["user_input"])
# 创建链
chain = prompt|gpt
# 运行链
result = chain.invoke({"user_input": "如何做一个好吃的巧克力蛋糕?"})
print(result.content)
🌟 小案例:翻译助手
链(Chain)是 LangChain 中用于组合模型、内存和提示词的核心概念。通过链,开发者可以创建复杂的多步骤流程,实现更高级的功能。
# 配置api
import os
os.environ["OPENAI_BASE_URL"] = "https://oneapi.handbook.cool/v1"
os.environ["OPENAI_API_KEY"] = "sk-XnbHbzBOmPYGHgL_8q1nHn9pF7SRIQO-3M0QhYcpYAmV3kxQJ7SiqbzfETE"
# 创建模型
from langchain_openai import ChatOpenAI
# OpenAI模型
gpt = ChatOpenAI(model="gpt-4.1-nano",temperature=0.1)
# 创建翻译链
translator_prompt = PromptTemplate(
template="""
将以下{source_language}文本翻译成{target_language}:
{text}
仅返回翻译结果,不要添加解释或其他内容。
""",
input_variables=["source_language", "target_language", "text"]
)
translator_chain = translator_prompt|gpt
# 使用翻译链
sample_text = "人工智能正在改变我们的生活方式和工作方式。"
languages = ["英语", "法语", "西班牙语", "日语"]
for lang in languages:
result = translator_chain.invoke({
"source_language": "中文",
"target_language": lang,
"text": sample_text
})
print(f"翻译成{lang}: {result.content}")
4. 工具(Tools)
LangChain 允许开发者将模型与其他工具结合使用,从而扩展模型的功能。例如,可以调用外部 API 或使用特定的工具函数来增强模型的能力。
from langchain.tools import Tool
import random
import os
from langchain_community.utilities import SerpAPIWrapper
# 虚拟搜索引擎工具
class VirtualSearchEngine:
@staticmethod
def run(query: str) -> str:
"""模拟搜索引擎返回虚拟结果"""
if "天气" in query:
cities = ["北京", "上海", "广州", "深圳"]
city = random.choice(cities)
weathers = ["晴", "多云", "小雨", "阴"]
temperature = f"{random.randint(18, 32)}°C"
return f"{city}今日天气:{random.choice(weathers)},气温 {temperature}"
elif "数据" in query:
return "虚拟统计数据:2023年全球GDP增长率约为3.1%"
else:
return f"已找到关于『{query}』的虚拟结果(此处为模拟数据)"
# 真实API调用
# from langchain_community.utilities import SerpAPIWrapper
#
# real_search = SerpAPIWrapper(serpapi_api_key="你的真实API密钥")
# 创建工具
# 使用虚拟工具(默认)
search_tool = Tool(
name="搜索引擎",
func=VirtualSearchEngine.run,
description="用于模拟搜索的虚拟工具(无需API密钥)"
)
# 若要使用真实API,取消注释以下代码并注释上面的虚拟工具
# search_tool = Tool(
# name="真实搜索引擎",
# func=real_search.run,
# description="调用真实搜索引擎(需配置SERPAPI_API_KEY)"
# )
# 测试工具
if __name__ == "__main__":
# 测试虚拟搜索
print(search_tool.run("北京天气"))
# 若要测试真实API,取消注释以下代码
# print(search_tool.run("今日北京天气"))
5. 记忆(Memory)
内存组件用于存储和管理对话上下文信息。LangChain 提供了多种内存组件,包括简单的内存缓冲区和与外部存储系统(如 Redis、Pinecone)的集成。
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
# 创建模型实例
llm = ChatOpenAI(
model="gpt-4.1-nano", # 更新为有效模型名称
temperature=0.7
)
# 创建记忆组件(保持使用 chat_history 作为键名)
memory = ConversationBufferMemory(
return_messages=True,
memory_key="chat_history" # 保留自定义键名
)
# 自定义提示模板(匹配 chat_history 键名)
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个友好的AI助手,请用中文进行自然对话"),
MessagesPlaceholder(variable_name="chat_history"), # 与记忆键名匹配
("human", "{input}"),
])
# 创建对话链(显式指定提示模板)
conversation = ConversationChain(
llm=llm,
memory=memory,
prompt=prompt, # 使用自定义模板
verbose=True
)
# 进行多轮对话(保持不变)
def chat_with_agent(user_input):
response = conversation.invoke({"input": user_input})
return response["response"]
# 测试对话(保持不变)
print("=== 开始对话 ===")
print("用户: 我的名字叫小明")
response1 = chat_with_agent("我的名字叫小明")
print(f"AI: {response1}\n")
print("用户: 你还记得我的名字吗?")
response2 = chat_with_agent("你还记得我的名字吗?")
print(f"AI: {response2}\n")
print("用户: 请总结一下我们的对话")
response3 = chat_with_agent("请总结一下我们的对话")
print(f"AI: {response3}\n")
# 查看记忆内容(保持不变)
print("=== 对话历史 ===")
print(memory.buffer)
6. Agent(智能体)
Agent 是 LangChain 中用于自动化任务的高级组件。代理可以根据给定的任务目标,自动选择和调用适当的工具和链,以完成复杂的任务。
from langchain.agents import initialize_agent, AgentType
from langchain_openai import ChatOpenAI
from langchain.tools import Tool
# 定义工具
def get_weather(location):
"""获取指定位置的天气(示例函数)"""
return f"{location}今天晴朗,温度25°C"
def search_database(query):
"""在数据库中搜索信息(示例函数)"""
return f"数据库中关于'{query}'的信息:[模拟数据]"
# 创建工具列表
tools = [
Tool(
name="天气查询",
func=get_weather,
description="查询特定地点的天气情况"
),
Tool(
name="数据库搜索",
func=search_database,
description="在公司数据库中搜索信息"
)
]
# 初始化Agent
agent = initialize_agent(
tools=tools,
llm=ChatOpenAI(temperature=0),
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 让Agent执行任务
result = agent.invoke({"input": "我想知道北京的天气,并且查询一下关于'销售报表'的数据"})
print(result["output"])
实际案例:构建客户支持Agent
让我们构建一个真实的客户支持Agent,它可以查询FAQ、检索产品信息,并回答用户问题:
# 配置API
import os
os.environ["OPENAI_BASE_URL"] = "https://oneapi.handbook.cool/v1"
os.environ["OPENAI_API_KEY"] = "sk-XnbHbzBOmPYGHgL_8q1nHn9pF7SRIQO-3M0QhYcpYAmV3kxQJ7SiqbzfETE"
#设定模型
from langchain_openai import ChatOpenAI
# OpenAI模型
llm = ChatOpenAI(model="gpt-4.1-nano",temperature=0.1)
from langchain.agents import initialize_agent, AgentType
from langchain_openai import ChatOpenAI
from langchain.memory import ConversationBufferMemory
from langchain.tools import Tool
# 模拟数据库
product_database = {
"手机A": {"价格": "¥3999", "颜色": ["黑色", "白色", "蓝色"], "内存": "8GB+256GB"},
"平板B": {"价格": "¥2999", "颜色": ["银色", "灰色"], "内存": "6GB+128GB"},
"笔记本C": {"价格": "¥6999", "颜色": ["银色"], "内存": "16GB+512GB"}
}
faq_database = {
"退货政策": "购买后30天内可以无理由退货,但产品必须完好无损并包含所有配件。",
"保修期": "所有电子产品享有一年保修服务,电池和配件保修期为6个月。",
"送货时间": "正常情况下,订单将在1-3个工作日内送达。"
}
# 定义工具函数
def search_product(product_name):
"""搜索产品信息"""
if product_name in product_database:
return f"产品信息:{product_database[product_name]}"
return f"未找到产品'{product_name}'的信息。"
def query_faq(question_keyword):
"""查询常见问题"""
results = []
for key, value in faq_database.items():
if question_keyword.lower() in key.lower():
results.append(f"{key}: {value}")
if results:
return "\n".join(results)
return f"未找到与'{question_keyword}'相关的常见问题。"
# 创建工具
tools = [
Tool(
name="产品搜索",
func=search_product,
description="当用户询问特定产品信息时使用,输入参数只为产品名称(如:产品A)"
),
Tool(
name="FAQ查询",
func=query_faq,
description="当用户询问政策、流程等常见问题时使用,输入参数为问题关键词"
)
]
# 创建记忆组件
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# 初始化客服Agent
customer_support_agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
memory=memory,
verbose=True
)
# 测试客服Agent
queries = [
"你们的平板B的价格?",
"它有什么颜色?",
"你们的退货政策是什么?",
"如果我的笔记本C坏了怎么办?"
]
for query in queries:
response = customer_support_agent.invoke({"input": query})
print(f"用户: {query}")
print(f"客服Agent: {response['output']}")
print("-" * 50)
最佳实践
- 模块化开发:将复杂Agent拆分成多个专用链和子组件
- 测试提示模板:不断迭代和改进提示,确保获得理想输出
- 错误处理:实现重试逻辑和错误处理机制
- 日志记录:在开发时启用verbose模式,了解内部工作原理
- 记忆管理:对于长对话,考虑使用摘要记忆或向量存储
下一步
完成本章后,你已经掌握了使用LangChain构建基本Agent的能力。接下来,你可以:
- 探索更多LangChain组件和集成
- 学习如何使用LangGraph构建更复杂的Agent工作流
- 为你的Agent添加更多工具和能力
- 使用向量数据库实现RAG(检索增强生成)
祝你在LangChain的旅程中取得成功!🚀