上一篇文章使用Langchain搭建了一个RAG工作流,现在将RAG拓展到ReAct模式下的Agent,即智能体代理。这使得模型从原本的文本生成扩展到能够执行任务的重大跨越。
在构建一个支持外部任务执行的智能Agent时,LangChain提供了一整套高效的工具模块和API。本文将详细讲解如何使用这些模块,创建一个能够执行外部任务、查询知识库并与数据库交互的智能Agent。
一、基本功能需求
为了增强LLM的功能,我们需要引入外部任务支持,主要包括:
- 检索功能:通过知识库(如向量数据库)实现RAG(检索增强生成)的能力。
- 代码解释与执行:让LLM能够运行生成的Python代码。
- 数据库交互:支持数据存储与查询。
- 对话记忆:使用对话历史信息保持上下文连贯性。
二、知识库与检索工具的实现
首先,我们需要一个知识库工具,用于从现有的向量数据库中检索相关信息。以下是代码实现:
from langchain.tools.retriever import create_retriever_tool
from langchain.vectorstores import FAISS
# 加载向量数据库
db_path = "db"
new_db = FAISS.load_local(db_path, embeddings, allow_dangerous_deserialization=True)
# 构建检索器
retriever = new_db.as_retriever()
# 定义检索工具
retriever_tool = create_retriever_tool(
retriever,
name="知识库",
description="这里存储着有关于问题的背景资料,you must use this tool!"
)
通过上述代码,LLM能够通过调用retriever_tool
从知识库中获取相关背景信息,为后续任务提供支持。
三、代码解释器工具
为了让LLM能够生成并执行Python代码,我们需要一个代码解释器工具。该工具可以接收用户输入的代码并返回执行结果:
from langchain.tools import tool
def execute_and_return(code: str) -> str:
try:
# 执行代码并捕获结果
exec_locals = {}
exec(code, {}, exec_locals)
return f"Execution Result: {exec_locals}"
except Exception as e:
return f"Error: {str(e)}"
@tool
def interpreter(code: str) -> str:
"""
执行并返回Python代码的结果。
"""
return execute_and_return(code)
四、数据库交互工具
通过SQLite实现简单的数据库交互,包括数据保存和查询:
import sqlite3
@tool
def save_to_db(query: str) -> str:
"""
保存数据到数据库中。
"""
db = sqlite3.connect('data.db')
cursor = db.cursor()
try:
cursor.execute(query)
db.commit()
return "Data saved successfully."
except Exception as e:
return f"Error: {str(e)}"
finally:
db.close()
@tool
def get_from_db(query: str) -> str:
"""
从数据库中查询数据。
"""
db = sqlite3.connect('data.db')
cursor = db.cursor()
try:
cursor.execute(query)
result = cursor.fetchall()
return str(result)
except Exception as e:
return f"Error: {str(e)}"
finally:
db.close()
五、整合工具与对话记忆
使用ConversationBufferWindowMemory
模块存储对话历史,实现对话连贯性:
from langchain.memory import ConversationBufferWindowMemory
# 定义对话记忆
memory = ConversationBufferWindowMemory(
memory_key="chat_history",
k=3,
return_messages=True
)
整合所有工具后,我们通过initialize_agent
函数构建Agent:
from langchain.agents import initialize_agent
tools = [interpreter, save_to_db, get_from_db, retriever_tool]
# 初始化Agent
chat_agent = initialize_agent(
agent="chat-conversational-react-description",
tools=tools,
memory=memory,
verbose=True,
max_iterations=3,
llm=llm,
handle_parsing_errors=True
)
六、使用Agent处理查询
以下示例展示了如何使用构建的Agent进行对话与任务处理:
# 示例对话
query = "今天买菜花了30元,买了一些蔬菜和水果。"
response = chat_agent.invoke(query)
print(response)
# 数据库查询
query = "到数据库中查询今天的花费"
response = chat_agent.invoke(query)
print(response)
七、总结
通过以上实现,我们构建了一个强大的智能Agent,其具备以下功能:
- 利用知识库进行背景信息检索;
- 执行生成的Python代码;
- 与数据库交互,完成数据存储与查询;
- 保持对话连贯性,提供更自然的用户交互体验。
这一框架可以根据需求进一步扩展,适用于客服、辅助决策等多种场景,为LLM的应用提供了更强的主动性与实用性。