LangChain-KR项目:使用多种LLM构建工具调用Agent的完整指南
引言
在现代AI应用开发中,能够调用外部工具的智能代理(Agent)变得越来越重要。LangChain-KR项目中的15-Agent/04-Agent-More-LLMs模块展示了如何利用多种大型语言模型(LLM)来构建功能强大的工具调用Agent。本文将深入解析这一技术实现,帮助开发者理解其核心概念和实际应用。
环境准备与基础配置
在开始构建Agent之前,我们需要完成一些基础配置工作:
- API密钥管理:使用dotenv库从环境变量中安全加载API密钥
- 日志追踪设置:配置LangSmith进行执行过程的追踪记录
from dotenv import load_dotenv
load_dotenv()
from langchain_teddynote import logging
logging.langsmith("CH15-Agents")
工具定义与实现
工具(Tool)是Agent能够调用的外部功能模块。在本示例中,我们定义了一个新闻搜索工具:
from langchain.tools import tool
from typing import List, Dict
from langchain_teddynote.tools import GoogleNews
@tool
def search_news(query: str) -> List[Dict[str, str]]:
"""使用关键词搜索Google新闻"""
news_tool = GoogleNews()
return news_tool.search_by_keyword(query, k=5)
这个工具接收一个查询字符串,返回包含5条相关新闻的列表。@tool
装饰器将其转换为LangChain能够识别的工具格式。
Agent提示工程
有效的提示(Prompt)设计对于Agent性能至关重要。我们构建了一个包含以下要素的提示模板:
- 系统消息:定义Agent的角色和能力
- 对话历史:支持多轮对话的上下文
- 用户输入:接收用户查询
- 草稿区:Agent的临时工作空间
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个乐于助人的助手。确保使用search_news工具搜索关键词相关新闻。"),
("placeholder", "{chat_history}"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
支持多种LLM的Agent实现
LangChain-KR项目展示了如何集成多种主流LLM提供商:
1. 初始化不同LLM客户端
from langchain_anthropic import ChatAnthropic
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_openai import ChatOpenAI
from langchain_ollama import ChatOllama
# OpenAI GPT-4o-mini
gpt = ChatOpenAI(model="gpt-4o-mini")
# Anthropic Claude-3-5-sonnet
claude = ChatAnthropic(model="claude-3-5-sonnet-20240620", temperature=0)
# Google Gemini-1.5-pro
gemini = ChatGoogleGenerativeAI(model="gemini-1.5-pro", temperature=0)
# Together AI的Llama-3.1-70B
llama = ChatOpenAI(
base_url="https://api.together.xyz/v1",
api_key=os.environ["TOGETHER_API_KEY"],
model="meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",
)
# Ollama的Llama-3.1
ollama = ChatOllama(model="llama3.1", temperature=0)
# Ollama的Qwen2.5 7B(中文优化)
qwen = ChatOllama(model="qwen2.5:latest")
2. 创建Agent执行器
Agent执行器负责管理Agent的生命周期和工具调用流程:
from langchain.agents import create_tool_calling_agent, AgentExecutor
def execute_agent(llm, tools, input_text, label):
agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=False)
result = executor.invoke({"input": input_text})
print(f"[{label}] 执行结果:")
if isinstance(result["output"], list):
for item in result["output"]:
print(item.get("text", str(item)))
else:
print(result["output"])
实际应用示例
我们可以使用不同的LLM来执行相同的任务,比较它们的表现:
query = "搜索AI投资相关新闻,并以Instagram帖子格式呈现结果"
# 使用GPT-4o-mini
execute_agent(gpt, tools, query, "GPT-4o-mini")
# 使用Claude-3-5-sonnet
execute_agent(claude, tools, query, "Claude-3-5-sonnet")
# 使用Gemini-1.5-pro
execute_agent(gemini, tools, query, "Gemini-1.5-pro")
# 使用Llama-3.1-70B(Together AI)
execute_agent(llama, tools, query, "Llama-3.1-70B")
# 使用Llama-3.1(Ollama)
execute_agent(ollama, tools, query, "Llama-3.1(Ollama)")
# 使用Qwen2.5 7B(中文优化)
execute_agent(qwen, tools, query+"请用中文回答", "Qwen2.5(Ollama)")
技术要点解析
- 工具调用机制:Agent能够自动识别何时需要调用工具,并正确处理工具返回结果
- 多LLM支持:统一的接口支持多种LLM提供商,便于比较和切换
- 提示工程:精心设计的提示模板确保Agent行为符合预期
- 执行流程:AgentExecutor管理完整的执行周期,包括工具调用、错误处理等
最佳实践建议
- 工具设计:确保工具功能单一明确,文档描述准确
- 错误处理:为AgentExecutor配置handle_parsing_errors=True以处理解析错误
- 性能监控:利用LangSmith追踪Agent执行过程,优化性能
- 多语言支持:对于中文场景,Qwen等优化模型可能表现更好
结语
LangChain-KR项目中的这个示例展示了构建多功能Agent的强大能力。通过支持多种LLM和外部工具,开发者可以创建适应不同场景的智能代理。理解这些核心概念后,你可以进一步扩展此框架,集成更多工具和定制功能,打造更强大的AI应用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考