LangChain vs 直接 API 调用对比指南
LangChain vs 直接 API 调用对比指南
1. 基础架构对比
系统架构图
2. 连续对话能力对比
LangChain 连续对话实现
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
from langchain.chat_models import ChatOpenAI
# 初始化对话记忆和模型
memory = ConversationBufferMemory()
llm = ChatOpenAI(temperature=0.7)
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
# 连续对话示例
response1 = conversation.predict(input="你好,我叫小明")
response2 = conversation.predict(input="我刚才说我叫什么?") # 能够记住上下文
直接 API 连续对话实现
class Conversation:
def __init__(self):
self.messages = []
def chat(self, message: str) -> str:
# 添加用户消息
self.messages.append({"role": "user", "content": message})
# API 调用
response = requests.post(
"API_ENDPOINT",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"messages": self.messages,
"temperature": 0.7
}
)
# 保存助手回复
assistant_message = response.json()['choices'][0]['message']
self.messages.append(assistant_message)
return assistant_message['content']
# 使用示例
conversation = Conversation()
response1 = conversation.chat("你好,我叫小明")
response2 = conversation.chat("我刚才说我叫什么?")
对话流程图
3. 插件(Tools)能力对比
LangChain Tools 实现
from langchain.agents import load_tools, initialize_agent
from langchain.agents import AgentType
from langchain.tools import Tool
from langchain.utilities import GoogleSearchAPIWrapper
# 加载预定义工具
tools = load_tools(["google-search", "llm-math"])
# 自定义工具
def get_weather(location: str) -> str:
"""获取指定位置的天气信息"""
# 实现天气查询逻辑
return f"{location}的天气信息"
# 创建自定义工具
custom_tool = Tool(
name="Weather",
func=get_weather,
description="获取指定位置的天气信息"
)
# 添加到工具列表
tools.append(custom_tool)
# 初始化 agent
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 使用 agent
response = agent.run("北京今天的天气怎么样?顺便帮我计算一下 23 * 45")
直接 API 实现插件功能
class APIWithTools:
def __init__(self):
self.tools = {
"weather": self.get_weather,
"calculator": self.calculate,
"search": self.search
}
def get_weather(self, location: str) -> str:
# 实现天气查询逻辑
return f"{location}的天气信息"
def calculate(self, expression: str) -> str:
# 实现计算逻辑
return str(eval(expression))
def search(self, query: str) -> str:
# 实现搜索逻辑
return f"搜索结果: {query}"
def process_with_tools(self, message: str) -> str:
# 调用API判断是否需要使用工具
response = requests.post(
"API_ENDPOINT",
json={
"messages": [{"role": "user", "content": message}],
"tools": list(self.tools.keys())
}
)
# 如果需要使用工具,先执行工具调用
if "tool_calls" in response.json():
tool_results = []
for tool_call in response.json()["tool_calls"]:
tool_name = tool_call["name"]
tool_args = tool_call["arguments"]
result = self.tools[tool_name](**tool_args)
tool_results.append(result)
# 将工具结果发送给API
final_response = requests.post(
"API_ENDPOINT",
json={
"messages": [
{"role": "user", "content": message},
{"role": "assistant", "content": "工具调用结果:" + str(tool_results)}
]
}
)
return final_response.json()["choices"][0]["message"]["content"]
return response.json()["choices"][0]["message"]["content"]
工具调用流程图
API工具调用
LangChain工具调用
4. 记忆系统对比
记忆类型图
5. 选择建议
功能需求矩阵
6. 注意事项
LangChain 注意点
学习曲线较陡
需要理解框架概念
版本更新可能带来变化
可能存在性能开销
工具配置需要额外设置
直接 API 注意点
需要自行实现功能
错误处理需要更多代码
扩展性需要自行设计
维护成本可能更高
工具集成需要自行开发
7. 性能对比
响应时间对比
8. 开发效率对比
开发时间估算
LangChain 通过提供现成的组件大大减少了开发时间,特别是在实现复杂功能时。而直接 API 调用虽然前期开发较快,但随着功能复杂度增加,开发时间会显著增长。
License:
CC BY 4.0