跳转至

如何使用LangChain

欢迎来到Agent开发的瑞士军刀——LangChain!🔗✨

LangChain是什么?

LangChain是一个强大的框架,专为开发由语言模型驱动的应用而设计。它提供了一套标准化的接口、组件和工具,让你可以轻松构建复杂的AI应用和Agent,而不必从头开始编写所有基础代码。

如果把OpenAI API比作是一块CPU,那么LangChain就是一台预装了操作系统和常用软件的完整电脑!

为什么使用LangChain?

想象你正在搭建一座房子。你可以自己从头制作每一块砖、每根电线和每个水管,但那太费时间了!LangChain就像是提供了预制构件,让你能快速组装出功能完整的房子:

  • 不重复造轮子:常见功能已经打包好了
  • 模块化设计:像乐高一样组合不同功能
  • 抽象底层复杂性:关注业务逻辑而非技术细节
  • 多模型支持:轻松切换不同的LLM提供商

安装与设置

pip install langchain langchain-openai

别忘了配置你的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)

最佳实践

  1. 模块化开发:将复杂Agent拆分成多个专用链和子组件
  2. 测试提示模板:不断迭代和改进提示,确保获得理想输出
  3. 错误处理:实现重试逻辑和错误处理机制
  4. 日志记录:在开发时启用verbose模式,了解内部工作原理
  5. 记忆管理:对于长对话,考虑使用摘要记忆或向量存储

下一步

完成本章后,你已经掌握了使用LangChain构建基本Agent的能力。接下来,你可以:

  • 探索更多LangChain组件和集成
  • 学习如何使用LangGraph构建更复杂的Agent工作流
  • 为你的Agent添加更多工具和能力
  • 使用向量数据库实现RAG(检索增强生成)

祝你在LangChain的旅程中取得成功!🚀