大模型应用开发(六):基于LangChain+LLM的agent实战教学包含Memory(上下文记忆和记忆存储)记忆功能

概要

主要用于通过 LangChain 框架创建一个 ReAct 代理,用于查询 SQLite 数据库中的内容,并根据用户问题生成合适的 SQL 查询执行,最后返回查询结果。它整合了 LLM(大语言模型)和数据库查询能力。

整体架构流程

需要安装包

pip install redis

整体流程:

用户输入问题
    ↓
ReAct 代理 (create_react_agent)
    ↓
决定使用工具 -> 调用自定义工具 (SQLiteInfo)
    ↓
生成 SQL 查询 -> 查询数据库 (SQLDatabaseChain)
    ↓
返回数据库查询结果
    ↓
整理并返回最终答案给用户

另外包含的记忆功能分为 ConversationBufferMemory(上下文记忆)和 Redis(记忆存储功能)

技术名词解释

  • Agent(代理): 是一种能够自主决策和行动的模块,通常用于处理复杂任务。代理通过与外部工具或数据源(如数据库、API等)的交互,来完成用户提出的问题或任务。
  • create_react_agent :是 LangChain 中一个用于创建 ReAct agent(反应代理)的函数。ReAct 代表“Reasoning and Acting”(推理与行动),是一种代理架构,结合了逻辑推理与外部工具调用,适用于处理复杂任务和需要动态决策的场景。
  • create_structured_chat_agent : Langchain 库中的一个函数,用于创建结构化的聊天代理(Structured Chat Agent)。这种代理可以处理用户输入并生成结构化的响应。它能够以更系统化的方式处理多步对话和任务,并且通常用于需要更严格的交互控制和跟踪的场景,比如工作流程自动化或复杂的任务管理。
  • Memory(记忆):模块 用于存储和管理对话的上下文,从而使得代理在处理多轮对话或连续任务时,可以记住之前的对话内容和信息。

技术细节

我们分为两部分:

第一部分是使用create_react_agent函数的Agent功能

完整代码1:

import json

from langchain.agents import create_react_agent, AgentExecutor
from langchain_community.utilities import SQLDatabase
from langchain_core.tools import tool
from langchain_experimental.sql import SQLDatabaseChain
from llm.model_init.init import LLModel
from langchain.prompts import PromptTemplate

api_key = "sk-xxx"

llm_instance = LLModel(api_key=api_key)

llm = llm_instance.initialize_Tongyi_model()

template = """Answer the following questions as best you can. You have access to the following tools:

{tools}

Use the following format:

Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: {input}
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question

Begin!

Question: {input}
Thought:{agent_scratchpad}"""

# agent_scratchpad是代理使用过程展示
prompt = PromptTemplate(input_variables=["tools", "tool_names", "input", "agent_scratchpad"], template=template)


@tool(return_direct=True)
def SQLiteInfo(query: str):
    """数据库相关内容,胜率,别名"""
    db = SQLDatabase.from_uri(f"sqlite:///D:/sqlite/ai.db")
    # 数据库提示词
    template = ''' 给定一个输入问题,优先查询示例,很重要,根据{input}严格按照示例进行筛选输出,
                   按照示例进行查询,首先创建一个语法正确的{dialect}查询来运行,然后查看查询结果并返回答案,不要执行任何。
                   使用以下格式:
                   示例1:
                   Question:"盲僧2024年10月16日的胜率情况和场次和他的别名"
                   SQLQuery: SELECT 
                               OPGGGGGGGG.OPGG_WINNING_RATE RATE, 
                               OPGGGGGGGG.OPGG_SESSION SESSION, 
                               LOL_HERO_MSG.LOL_ALIAS  ALIAS
                             FROM 
                               OPGG_MSG OPGGGGGGGG
                             JOIN 
                                LOL_HERO_MSG 
                             ON 
                                OPGGGGGGGG.OPGG_LOL_HERO_NAME_ID = LOL_HERO_MSG.ID 
                             WHERE 
                                OPGGGGGGGG.OPGG_UPDATE_TIME = '2024-10-16' 
                                AND LOL_HERO_MSG.LOL_HERO_NAME = '盲僧';
                   SQLResult:"SQLquery的查询结果"
                   Answer:"盲僧在2024年10月16日这一天的胜率为RATE%。出场次数为SESSION,他的别名叫做ALIAS。
                   仅使用以下的表:
                   {table_info}
                   问题:{input}'''

    prompt = PromptTemplate(
        input_variables=["dialect", "table_info", "input"],
        template=template
    )
    # 创建一个生成 SQL 查询的链
    db_chain = SQLDatabaseChain.from_llm(llm, db, prompt=prompt, verbose=True)
    # 运行查询问题
    response = db_chain.invoke(query)
    response = response["result"]
    return response


tools = [SQLiteInfo]
agent = create_react_agent(
    llm,
    tools,
    prompt
)

agent_executor = AgentExecutor(agent=agent,
                               tools=tools,
                               verbose=True)


def agent_test(query: str):
    response = agent_executor.invoke({"input": query})
    result = response["output"]
    result = json.dumps(result, ensure_ascii=False)
    result = json.loads(result)
    return result


if __name__ == "__main__":
    print(agent_test("盲僧2024年10月16日的胜率情况和场次和他的别名"))

1.LLM 模型初始化:

这一部分在我之前的文章大模型应用开发(一)中实现,包含代码LLModel和initialize_Tongyi_model的代码。

api_key = "sk-xxx"

llm_instance = LLModel(api_key=api_key)

llm = llm_instance.initialize_Tongyi_model()

2.PromptTemplate(提示模板)定义

这个 template 是我通过 LangChain Hub 获取的。实际上,可以直接使用以下代码来加载模板:

prompt = hub.pull("hwchase17/structured-chat-agent")

不过,为了方便理解和便于后续修改提示词,我选择将其改写为更具可读性的代码形式:

"""请尽可能回答以下问题。您可以使用以下工具: 使用以下格式: 问题:您必须回答的输入问题 思考:您应该始终考虑要做什么 操作:要采取的行动,应该是[{tool_names}]之一 行动输入:{input} 观察:行动的结果...(这个 ThoughtActionAction InputObservation 可以重复 N 次)思考:我现在知道最终答案了 最终答案:原始输入问题的最终答案 Begin!问题:{input} 想法:{agent_scratchpad}"""

template = """Answer the following questions as best you can. You have access to the following tools:

{tools}

Use the following format:

Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: {input}
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question

Begin!

Question: {input}
Thought:{agent_scratchpad}"""

# agent_scratchpad是代理使用过程展示
prompt = PromptTemplate(input_variables=["tools", "tool_names", "input", "agent_scratchpad"], template=template)

可以看到其中的input_variables中的参数:
tools:SQLiteInfo
tool_names:tools的工具中的名称,提供给agent选择
input: 用户输入的问题
agent_scratchpad:可以理解为agent思考的过程

我们需要定义tools,输入input两个参数,agent_scratchpad并不需要实际定义。

3. SQLite 数据库查询工具 (SQLiteInfo)

@tool 装饰器 用来创建一个名为 SQLiteInfo 的工具,它封装了 SQLite 数据库的查询逻辑,并通过 SQL 查询来获取数据。该工具可以直接返回查询结果给用户。
这一块我们需要注意的内容
1.@tool装饰器
from langchain_core.tools import tool,源码中有很多参数,感兴趣的小伙伴可以自行查看。
这块内容除了@tool,都可以从之前的文章中查看大模型应用开发(三)

# return_direct=True代表是否直接从工具返回,而不是继续代理循环
@tool(return_direct=True)
def SQLiteInfo(query: str):
    """数据库相关内容,胜率,别名"""
    db = SQLDatabase.from_uri(f"sqlite:///D:/sqlite/ai.db")
    # 数据库提示词
    template = ''' 给定一个输入问题,优先查询示例,很重要,根据{input}严格按照示例进行筛选输出,
                   按照示例进行查询,首先创建一个语法正确的{dialect}查询来运行,然后查看查询结果并返回答案,不要执行任何。
                   使用以下格式:
                   示例1:
                   Question:"盲僧2024年10月16日的胜率情况和场次和他的别名"
                   SQLQuery: SELECT 
                               OPGGGGGGGG.OPGG_WINNING_RATE RATE, 
                               OPGGGGGGGG.OPGG_SESSION SESSION, 
                               LOL_HERO_MSG.LOL_ALIAS  ALIAS
                             FROM 
                               OPGG_MSG OPGGGGGGGG
                             JOIN 
                                LOL_HERO_MSG 
                             ON 
                                OPGGGGGGGG.OPGG_LOL_HERO_NAME_ID = LOL_HERO_MSG.ID 
                             WHERE 
                                OPGGGGGGGG.OPGG_UPDATE_TIME = '2024-10-16' 
                                AND LOL_HERO_MSG.LOL_HERO_NAME = '盲僧';
                   SQLResult:"SQLquery的查询结果"
                   Answer:"盲僧在2024年10月16日这一天的胜率为RATE%。出场次数为SESSION,他的别名叫做ALIAS。
                   仅使用以下的表:
                   {table_info}
                   问题:{input}'''

    prompt = PromptTemplate(
        input_variables=["dialect", "table_info", "input"],
        template=template
    )
    # 创建一个生成 SQL 查询的链
    db_chain = SQLDatabaseChain.from_llm(llm, db, prompt=prompt, verbose=True)
    # 运行查询问题
    response = db_chain.invoke(query)
    response = response["result"]
    return response
 
tools = [SQLiteInfo]

4. ReAct 代理的创建

使用 create_react_agent 函数创建 ReAct 代理,并调用之前定义的提示模板和 SQLiteInfo 工具。

agent = create_react_agent(
    llm,
    tools,
    prompt
)

5.AgentExecutor(代理执行器)

创建AgentExecutor,传参就是agen,tools,verbose(显示agent的执行过程)

agent_executor = AgentExecutor(agent=agent,
                               tools=tools,
                               verbose=True)

6.调用

创建agent_test函数,调用AgentExecutor输入传参input,接收答案,这里需要

 result = json.dumps(result, ensure_ascii=False)

否则会出现Unicode 编码的情况

def agent_test(query: str):
    response = agent_executor.invoke({"input": query})
    result = response["output"]
    result = json.dumps(result, ensure_ascii=False)
    result = json.loads(result)
    return result


if __name__ == "__main__":
    print(agent_test("盲僧2024年10月16日的胜率情况和场次和他的别名"))

接下来运行查看结果

D:\AI\conda\envs\aiAgent\python.exe D:\Pycharm\aiAgent\pythonProject\llm\agent_test\agent_easy.py 


> Entering new AgentExecutor chain...
我需要查询数据库来获取盲僧在20241016日的胜率、比赛场次以及他的别名。
Action: SQLiteInfo
Action Input: 盲僧20241016日的胜率情况和场次和他的别名

> Entering new SQLDatabaseChain chain...
盲僧20241016日的胜率情况和场次和他的别名
SQLQuery:```sql
SELECT 
    OPGG_MSG.OPGG_WINNING_RATE AS RATE, 
    OPGG_MSG.OPGG_SESSION AS SESSION, 
    LOL_HERO_MSG.LOL_ALIAS AS ALIAS
FROM 
    OPGG_MSG
JOIN 
    LOL_HERO_MSG 
ON 
    OPGG_MSG.OPGG_LOL_HERO_NAME_ID = LOL_HERO_MSG.ID 
WHERE 
    OPGG_MSG.OPGG_UPDATE_TIME = '2024-10-16' 
    AND LOL_HERO_MSG.LOL_HERO_NAME = '盲僧';
SQLResult: [('49.32', 131374, '瞎子')]
Answer:盲僧在20241016日这一天的胜率为49.32%。出场次数为131374,他的别名叫做瞎子。
> Finished chain.
盲僧在20241016日这一天的胜率为49.32%。出场次数为131374,他的别名叫做瞎子。


> Finished chain.
盲僧在20241016日这一天的胜率为49.32%。出场次数为131374,他的别名叫做瞎子。

Process finished with exit code 0

第二部分是使用create_react_agent函数的Agent功能

一、使用ConversationBufferMemory的部分

完整代码2:

import json

from langchain import hub
from langchain.agents import AgentExecutor, create_structured_chat_agent
from langchain.memory import ConversationBufferMemory
from langchain_community.utilities import SQLDatabase
from langchain_core.tools import tool
from langchain_experimental.sql import SQLDatabaseChain
from llm.model_init.init import LLModel
from langchain.prompts import PromptTemplate

api_key = "sk-xxx"

llm_instance = LLModel(api_key=api_key)

llm = llm_instance.initialize_Tongyi_model()

prompt = hub.pull("hwchase17/structured-chat-agent")


@tool(return_direct=True)
def SQLiteInfo(query: str):
    """数据库相关内容,胜率,别名"""
    db = SQLDatabase.from_uri(f"sqlite:///D:/sqlite/ai.db")
    # 数据库提示词
    template = ''' 给定一个输入问题,优先查询示例,很重要,根据{input}严格按照示例进行筛选输出,
                   按照示例进行查询,首先创建一个语法正确的{dialect}查询来运行,然后查看查询结果并返回答案,不要执行任何。
                   使用以下格式:
                   示例1:
                   Question:"盲僧2024年10月16日的胜率情况和场次和他的别名"
                   SQLQuery: SELECT 
                               OPGGGGGGGG.OPGG_WINNING_RATE RATE, 
                               OPGGGGGGGG.OPGG_SESSION SESSION, 
                               LOL_HERO_MSG.LOL_ALIAS  ALIAS
                             FROM 
                               OPGG_MSG OPGGGGGGGG
                             JOIN 
                                LOL_HERO_MSG 
                             ON 
                                OPGGGGGGGG.OPGG_LOL_HERO_NAME_ID = LOL_HERO_MSG.ID 
                             WHERE 
                                OPGGGGGGGG.OPGG_UPDATE_TIME = '2024-10-16' 
                                AND LOL_HERO_MSG.LOL_HERO_NAME = '盲僧';
                   SQLResult:"SQLquery的查询结果"
                   Answer:"盲僧在2024年10月16日这一天的胜率为RATE%。出场次数为SESSION,他的别名叫做ALIAS。
                   仅使用以下的表:
                   {table_info}
                   问题:{input}'''

    prompt = PromptTemplate(
        input_variables=["dialect", "table_info", "input"],
        template=template
    )
    # 创建一个生成 SQL 查询的链
    db_chain = SQLDatabaseChain.from_llm(llm, db, prompt=prompt, verbose=True)
    # 运行查询问题
    response = db_chain.invoke(query)
    response = response["result"]
    return response


tools = [SQLiteInfo]
agent = create_structured_chat_agent(
    llm,
    tools,
    prompt
)


# 使用Memory记录上下文
memory = ConversationBufferMemory(
    memory_key='chat_history',
    return_messages=True
)

# 定义AgentExecutor,必须使用AgentExecutor,才能执行代理定义的工具
agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent, tools=tools, memory=memory, verbose=True, handle_parsing_errors=True
)


def agent_test(query: str):
    response = agent_executor.invoke({"input": query})
    result = response["output"]
    result = json.dumps(result, ensure_ascii=False)
    result = json.loads(result)
    return result


if __name__ == "__main__":
    print(agent_test("盲僧2024年10月16日的胜率情况和场次和他的别名"))
    print(agent_test("刚刚回答的问题是什么"))


和没有记忆功能的区别是
1.更换prompt

prompt = hub.pull("hwchase17/structured-chat-agent")

2.修改agent使用create_structured_chat_agent函数

agent = create_structured_chat_agent(
    llm,
    tools,
    prompt
)

3.使用Memory记录上下文

# 使用Memory记录上下文
memory = ConversationBufferMemory(
    memory_key='chat_history',
    return_messages=True
)

4.# 定义AgentExecutor,包含memory参数

agent_executor = AgentExecutor.from_agent_and_tools(
    agent=agent, tools=tools, memory=memory, verbose=True, handle_parsing_errors=True
)

执行代码查看结果:

> Entering new AgentExecutor chain...
Thought: 需要查询盲僧在20241016日的胜率、场次以及他的别名。

Action:

{
  "action": "SQLiteInfo",
  "action_input": {
    "query": "SELECT win_rate, matches_played, aliases FROM champions WHERE name = '盲僧' AND date = '2024-10-16'"
  }
}


> Entering new SQLDatabaseChain chain...
SELECT win_rate, matches_played, aliases FROM champions WHERE name = '盲僧' AND date = '2024-10-16'
SQLQuery:```sql
SELECT 
    OPGG_MSG.OPGG_WINNING_RATE AS win_rate, 
    OPGG_MSG.OPGG_SESSION AS matches_played, 
    LOL_HERO_MSG.LOL_ALIAS AS aliases
FROM 
    OPGG_MSG
JOIN 
    LOL_HERO_MSG 
ON 
    OPGG_MSG.OPGG_LOL_HERO_NAME_ID = LOL_HERO_MSG.ID 
WHERE 
    OPGG_MSG.OPGG_UPDATE_TIME = '2024-10-16' 
    AND LOL_HERO_MSG.LOL_HERO_NAME = '盲僧';


**SQLResult:** "SQLquery的查询结果"

**Answer:** "盲僧在2024年10月16日这一天的胜率为win_rate%。出场次数为matches_played,他的别名叫做aliases。"
SQLResult: [('49.32', 131374, '瞎子')]
Answer:盲僧在20241016日这一天的胜率为49.32%。出场次数为131374,他的别名叫做瞎子。
> Finished chain.
盲僧在20241016日这一天的胜率为49.32%。出场次数为131374,他的别名叫做瞎子。


> Finished chain.
盲僧在20241016日这一天的胜率为49.32%。出场次数为131374,他的别名叫做瞎子。


> Entering new AgentExecutor chain...
{
  "action": "Final Answer",
  "action_input": "您刚刚询问的是关于盲僧在2024年10月16日的胜率情况、出场次数和他的别名。"
}

> Finished chain.
您刚刚询问的是关于盲僧在20241016日的胜率情况、出场次数和他的别名。

Process finished with exit code 0

可以看到两部分action": “SQLiteInfo”,“action”: “Final Answer”,如果存在记忆action会变成Final Answer。

二、使用redis+Memory的部分

我们需要先安装redis+redis可视化工具,这部分在我的资源中有,或者可以网上查找资料安装一下。

完整代码3:

import json

from langchain import hub
from langchain.agents import AgentExecutor, create_structured_chat_agent
from langchain.memory import ConversationBufferMemory
from langchain_community.chat_message_histories import RedisChatMessageHistory
from langchain_community.utilities import SQLDatabase
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_core.tools import tool
from langchain_experimental.sql import SQLDatabaseChain
from llm.model_init.init import LLModel
from langchain.prompts import PromptTemplate

api_key = "sk-xxx"

llm_instance = LLModel(api_key=api_key)

llm = llm_instance.initialize_Tongyi_model()

prompt = hub.pull("hwchase17/structured-chat-agent")


@tool(return_direct=True)
def SQLiteInfo(query: str):
    """数据库相关内容,胜率,别名"""
    db = SQLDatabase.from_uri(f"sqlite:///D:/sqlite/ai.db")
    # 数据库提示词
    template = ''' 给定一个输入问题,优先查询示例,很重要,根据{input}严格按照示例进行筛选输出,
                   按照示例进行查询,首先创建一个语法正确的{dialect}查询来运行,然后查看查询结果并返回答案,不要执行任何。
                   使用以下格式:
                   示例1:
                   Question:"盲僧2024年10月16日的胜率情况和场次和他的别名"
                   SQLQuery: SELECT 
                               OPGGGGGGGG.OPGG_WINNING_RATE RATE, 
                               OPGGGGGGGG.OPGG_SESSION SESSION, 
                               LOL_HERO_MSG.LOL_ALIAS  ALIAS
                             FROM 
                               OPGG_MSG OPGGGGGGGG
                             JOIN 
                                LOL_HERO_MSG 
                             ON 
                                OPGGGGGGGG.OPGG_LOL_HERO_NAME_ID = LOL_HERO_MSG.ID 
                             WHERE 
                                OPGGGGGGGG.OPGG_UPDATE_TIME = '2024-10-16' 
                                AND LOL_HERO_MSG.LOL_HERO_NAME = '盲僧';
                   SQLResult:"SQLquery的查询结果"
                   Answer:"盲僧在2024年10月16日这一天的胜率为RATE%。出场次数为SESSION,他的别名叫做ALIAS。
                   仅使用以下的表:
                   {table_info}
                   问题:{input}'''

    prompt = PromptTemplate(
        input_variables=["dialect", "table_info", "input"],
        template=template
    )
    # 创建一个生成 SQL 查询的链
    db_chain = SQLDatabaseChain.from_llm(llm, db, prompt=prompt, verbose=True)
    # 运行查询问题
    response = db_chain.invoke(query)
    response = response["result"]
    return response


tools = [SQLiteInfo]
agent = create_structured_chat_agent(
    llm,
    tools,
    prompt
)

message_history = RedisChatMessageHistory(
    url="redis://127.0.0.1:6379/2", session_id="my-session"
)

# 定义AgentExecutor,必须使用AgentExecutor,才能执行代理定义的工具
agent_executor = AgentExecutor(agent=agent,
                               tools=tools,
                               verbose=True)

agent_with_chat_history = RunnableWithMessageHistory(
    agent_executor,
    # 必传参数,session_id 在大多数实际场景中,需要一个会话ID。它在这里并没有真正使用,
    # 因为我们使用的是一个简单的内存中的ChatMessageHistory
    lambda session_id: message_history,
    input_messages_key="input",
    history_messages_key="chat_history",
)

def agent_test(query: str):
    # 设置memory session_id
    response = agent_with_chat_history.invoke(
        {"input": query},
        config={"configurable": {"session_id": "123"}})

    result = response["output"]
    result = json.dumps(result, ensure_ascii=False)
    return result


if __name__ == "__main__":
    print(agent_test("盲僧2024年10月16日的胜率情况和场次和他的别名"))
    print(agent_test("刚刚回答的问题是什么"))


注意:使用redis需要修改langchain源码

D:\AI\conda\envs\aiAgent\Lib\site-packages\langchain_community\chat_message_histories\redis.py路径下
self.redis_client.lpush(self.key, json.dumps(message_to_dict(message)))修改为
self.redis_client.lpush(self.key, json.dumps(message_to_dict(message), ensure_ascii=False))
否则存入的中文会变成十六进制

这个部分内容
1.agent也需要是create_structured_chat_agent

agent = create_structured_chat_agent(
    llm,
    tools,
    prompt
)

2.定义redis

message_history = RedisChatMessageHistory(
    url="redis://127.0.0.1:6379/2", session_id="my-session"
)

3.使用AgentExecutor,并调用RunnableWithMessageHistory实现记忆存储

agent_executor = AgentExecutor(agent=agent,
                               tools=tools,
                               verbose=True)

agent_with_chat_history = RunnableWithMessageHistory(
    agent_executor,
    # 必传参数,session_id 在大多数实际场景中,需要一个会话ID。它在这里并没有真正使用,
    # 因为我们使用的是一个简单的内存中的ChatMessageHistory
    lambda session_id: message_history,
    input_messages_key="input",
    history_messages_key="chat_history",
)

4.调用方法
需要配置相同的session_id

def agent_test(query: str):
    # 设置memory session_id
    response = agent_with_chat_history.invoke(
        {"input": query},
        config={"configurable": {"session_id": "123"}})

    result = response["output"]
    result = json.dumps(result, ensure_ascii=False)
    return result


if __name__ == "__main__":
    print(agent_test("盲僧2024年10月16日的胜率情况和场次和他的别名"))
    print(agent_test("刚刚回答的问题是什么"))

查看结果:

> Entering new AgentExecutor chain...
Thought: 需要查询盲僧在20241016日的胜率、场次以及他的别名。

Action:

{
  "action": "SQLiteInfo",
  "action_input": {
    "query": "SELECT win_rate, matches_played, aliases FROM champions WHERE champion_name = '盲僧' AND date = '2024-10-16'"
  }
}


> Entering new SQLDatabaseChain chain...
SELECT win_rate, matches_played, aliases FROM champions WHERE champion_name = '盲僧' AND date = '2024-10-16'
SQLQuery:```sql
SELECT 
    OPGG_MSG.OPGG_WINNING_RATE AS win_rate, 
    OPGG_MSG.OPGG_SESSION AS matches_played, 
    LOL_HERO_MSG.LOL_ALIAS AS aliases
FROM 
    OPGG_MSG
JOIN 
    LOL_HERO_MSG 
ON 
    OPGG_MSG.OPGG_LOL_HERO_NAME_ID = LOL_HERO_MSG.ID 
WHERE 
    OPGG_MSG.OPGG_UPDATE_TIME = '2024-10-16' 
    AND LOL_HERO_MSG.LOL_HERO_NAME = '盲僧';
SQLResult: [('49.32', 131374, '瞎子')]
Answer:**示例1**

**Question:** "盲僧2024年10月16日的胜率情况和场次和他的别名"

**SQLQuery:**
```sql
SELECT 
    OPGG_MSG.OPGG_WINNING_RATE AS win_rate, 
    OPGG_MSG.OPGG_SESSION AS matches_played, 
    LOL_HERO_MSG.LOL_ALIAS AS aliases
FROM 
    OPGG_MSG
JOIN 
    LOL_HERO_MSG 
ON 
    OPGG_MSG.OPGG_LOL_HERO_NAME_ID = LOL_HERO_MSG.ID 
WHERE 
    OPGG_MSG.OPGG_UPDATE_TIME = '2024-10-16' 
    AND LOL_HERO_MSG.LOL_HERO_NAME = '盲僧';


**SQLResult:** [('49.32', 131374, '瞎子')]

**Answer:** "盲僧在2024年10月16日这一天的胜率为49.32%。出场次数为131374,他的别名叫做瞎子。"
> Finished chain.
**示例1**

**Question:** "盲僧2024年10月16日的胜率情况和场次和他的别名"

**SQLQuery:**
```sql
SELECT 
    OPGG_MSG.OPGG_WINNING_RATE AS win_rate, 
    OPGG_MSG.OPGG_SESSION AS matches_played, 
    LOL_HERO_MSG.LOL_ALIAS AS aliases
FROM 
    OPGG_MSG
JOIN 
    LOL_HERO_MSG 
ON 
    OPGG_MSG.OPGG_LOL_HERO_NAME_ID = LOL_HERO_MSG.ID 
WHERE 
    OPGG_MSG.OPGG_UPDATE_TIME = '2024-10-16' 
    AND LOL_HERO_MSG.LOL_HERO_NAME = '盲僧';


**SQLResult:** [('49.32', 131374, '瞎子')]

**Answer:** "盲僧在2024年10月16日这一天的胜率为49.32%。出场次数为131374,他的别名叫做瞎子。"


> Finished chain.
"**示例1:**\n\n**Question:** \"盲僧2024年10月16日的胜率情况和场次和他的别名\"\n\n**SQLQuery:**\n```sql\nSELECT \n    OPGG_MSG.OPGG_WINNING_RATE AS win_rate, \n    OPGG_MSG.OPGG_SESSION AS matches_played, \n    LOL_HERO_MSG.LOL_ALIAS AS aliases\nFROM \n    OPGG_MSG\nJOIN \n    LOL_HERO_MSG \nON \n    OPGG_MSG.OPGG_LOL_HERO_NAME_ID = LOL_HERO_MSG.ID \nWHERE \n    OPGG_MSG.OPGG_UPDATE_TIME = '2024-10-16' \n    AND LOL_HERO_MSG.LOL_HERO_NAME = '盲僧';\n```\n\n**SQLResult:** [('49.32', 131374, '瞎子')]\n\n**Answer:** \"盲僧在2024年10月16日这一天的胜率为49.32%。出场次数为131374,他的别名叫做瞎子。\""


> Entering new AgentExecutor chain...

{
  "action": "Final Answer",
  "action_input": "您刚刚询问的是关于盲僧在2024年10月16日的胜率情况、场次和他的别名。"
}


> Finished chain.
"您刚刚询问的是关于盲僧在2024年10月16日的胜率情况、场次和他的别名。"

redis可视化工具内容:
会把每个问题和回答都记录在其中
在这里插入图片描述

小结

这部分内容就到这里告一段落了,如果有任何疑问或意见,欢迎在评论区积极讨论和反馈!非常感谢大家的支持!

### LangChain Agent 实战示例项目教程 #### 了解LangChain Agent的工作原理 LangChain Agent是一种能够执行特定任务的人工智能实体,可以被设计成独立工作或与其他代理协同作业。这些代理通过一系列预定义的行为模式来完成复杂操作,比如查询数据库、解析文档以及调用API接口等[^1]。 #### 构建简单的问答机器人 为了展示如何创建一个基于LangChain Agent的应用程序实例,这提供了一个简易版的Python代码片段用于构建一个能回答简单问题的知识型聊天机器人: ```python from langchain import LangChainAgent, KnowledgeBaseTool def create_qa_bot(): kb_tool = KnowledgeBaseTool() # 初始化知识库工具 qa_agent = LangChainAgent( tools=[kb_tool], # 添加所需使用的工具列表 llm=OpenAI(), # 使用指定的语言模型作为LLM引擎 verbose=True # 设置为True以便查看详细的运行日志 ) return qa_agent if __name__ == "__main__": bot = create_qa_bot() while True: query = input("请输入您的问题 (输入'exit'退出): ") if query.lower().strip() == 'exit': break response = bot.run(query) print(f"Bot的回答: {response}") ``` 此段代码展示了怎样利用`KnowledgeBaseTool`类从内部存储的数据集中检索信息,并借助于大型语言模型(如OpenAI API)来进行自然语言处理生成回复。 #### 应用场景扩展——多代理协作机制下的任务分配 当面对更复杂的业务逻辑需求时,则可能涉及到多个不同类型的代理之间的交互合作。此时就需要引入像ReAct这样的框架来帮助管理各个代理间的通信流程与决策过程[^2]。例如,在上述例子基础上进一步增强功能,使其能够在必要时候自动切换至其他专门化的子代理以获取更加精准的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值