Langchain实践指南:实现一个Agent代理 | 豆包MarsCode AI刷题

50 阅读3分钟

上一篇文章使用Langchain搭建了一个RAG工作流,现在将RAG拓展到ReAct模式下的Agent,即智能体代理。这使得模型从原本的文本生成扩展到能够执行任务的重大跨越。

在构建一个支持外部任务执行的智能Agent时,LangChain提供了一整套高效的工具模块和API。本文将详细讲解如何使用这些模块,创建一个能够执行外部任务、查询知识库并与数据库交互的智能Agent。


一、基本功能需求

为了增强LLM的功能,我们需要引入外部任务支持,主要包括:

  1. 检索功能:通过知识库(如向量数据库)实现RAG(检索增强生成)的能力。
  2. 代码解释与执行:让LLM能够运行生成的Python代码。
  3. 数据库交互:支持数据存储与查询。
  4. 对话记忆:使用对话历史信息保持上下文连贯性。

二、知识库与检索工具的实现

首先,我们需要一个知识库工具,用于从现有的向量数据库中检索相关信息。以下是代码实现:

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,其具备以下功能:

  1. 利用知识库进行背景信息检索;
  2. 执行生成的Python代码;
  3. 与数据库交互,完成数据存储与查询;
  4. 保持对话连贯性,提供更自然的用户交互体验。

这一框架可以根据需求进一步扩展,适用于客服、辅助决策等多种场景,为LLM的应用提供了更强的主动性与实用性。