第二章: LangChain快速上手
LangChain简介
LangChain = 最流行的Agent开发框架
核心优势:
- 丰富的组件库(100+ tools)
- 灵活的链式调用
- 活跃的社区
- 完善的文档
环境搭建
安装
pip install langchain langchain-openai python-dotenv
配置API Key
# .env文件
OPENAI_API_KEY=sk-...
# Python代码
from dotenv import load_dotenv
load_dotenv()
第一个Agent(5分钟)
简单问答Agent
from langchain_openai import ChatOpenAI
from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain.tools import tool
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
# 1. 定义工具
@tool
def get_weather(city: str) -> str:
"""获取城市天气"""
# 模拟API调用
return f"{city}今天晴天,25°C"
# 2. 初始化LLM
llm = ChatOpenAI(model="gpt-4", temperature=0)
# 3. 创建Agent
tools = [get_weather]
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有用的助手"),
("user", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])
agent = create_openai_functions_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 4. 运行
result = agent_executor.invoke({"input": "北京天气如何?"})
print(result["output"])
输出示例:
> Thought: 我需要调用get_weather工具
> Action: get_weather
> Action Input: 北京
> Observation: 北京今天晴天,25°C
> Final Answer: 北京今天天气晴朗,温度25°C
核心概念
1. Tools(工具)
自定义工具:
from langchain.tools import tool
@tool
def calculator(expression: str) -> float:
"""计算数学表达式"""
return eval(expression)
@tool
def search_wikipedia(query: str) -> str:
"""搜索维基百科"""
# 实际调用Wikipedia API
return f"关于{query}的信息..."
2. Chains(链)
顺序链:
from langchain.chains import LLMChain, SequentialChain
# Chain 1: 生成故事大纲
chain1 = LLMChain(llm=llm, prompt=prompt1, output_key="outline")
# Chain 2: 根据大纲写故事
chain2 = LLMChain(llm=llm, prompt=prompt2, output_key="story")
# 串联
overall_chain = SequentialChain(
chains=[chain1, chain2],
input_variables=["topic"],
output_variables=["outline", "story"]
)
result = overall_chain({"topic": "太空探险"})
3. Memory(记忆)
对话记忆:
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history")
agent_executor = AgentExecutor(
agent=agent,
tools=tools,
memory=memory, # 添加记忆
verbose=True
)
# 第一轮
agent_executor.invoke({"input": "我叫张三"})
# 第二轮(记住上文)
agent_executor.invoke({"input": "我叫什么名字?"})
# 输出:你叫张三
下一章预告:RAG系统实战 - 构建企业级知识库问答系统。