文章目录
概要
主要用于通过 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...
我需要查询数据库来获取盲僧在2024年10月16日的胜率、比赛场次以及他的别名。
Action: SQLiteInfo
Action Input: 盲僧2024年10月16日的胜率情况和场次和他的别名
> Entering new SQLDatabaseChain chain...
盲僧2024年10月16日的胜率情况和场次和他的别名
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:盲僧在2024年10月16日这一天的胜率为49.32%。出场次数为131374,他的别名叫做瞎子。
> Finished chain.
盲僧在2024年10月16日这一天的胜率为49.32%。出场次数为131374,他的别名叫做瞎子。
> Finished chain.
盲僧在2024年10月16日这一天的胜率为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: 需要查询盲僧在2024年10月16日的胜率、场次以及他的别名。
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:盲僧在2024年10月16日这一天的胜率为49.32%。出场次数为131374,他的别名叫做瞎子。
> Finished chain.
盲僧在2024年10月16日这一天的胜率为49.32%。出场次数为131374,他的别名叫做瞎子。
> Finished chain.
盲僧在2024年10月16日这一天的胜率为49.32%。出场次数为131374,他的别名叫做瞎子。
> Entering new AgentExecutor chain...
{
"action": "Final Answer",
"action_input": "您刚刚询问的是关于盲僧在2024年10月16日的胜率情况、出场次数和他的别名。"
}
> Finished chain.
您刚刚询问的是关于盲僧在2024年10月16日的胜率情况、出场次数和他的别名。
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: 需要查询盲僧在2024年10月16日的胜率、场次以及他的别名。
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可视化工具内容:
会把每个问题和回答都记录在其中
小结
这部分内容就到这里告一段落了,如果有任何疑问或意见,欢迎在评论区积极讨论和反馈!非常感谢大家的支持!