♻️ refactor(代码): 重构数据库优化器逻辑

- 移除不必要的DatabaseOptimizer类及其配置
- 添加WebsiteKnowledgeBase以支持网页知识库
- 优化MCPTools的使用,合并多个工具的初始化
This commit is contained in:
2025-03-31 02:20:24 +08:00
parent 0455760852
commit 8e871647f6

View File

@@ -24,55 +24,9 @@ from agno.knowledge.combined import CombinedKnowledgeBase
from agno.tools.mcp import MCPTools
from mcp.client.stdio import stdio_client
from mcp import ClientSession, StdioServerParameters
from agno.knowledge.website import WebsiteKnowledgeBase
@dataclass
class DatabaseOptimizerConfig:
"""数据库优化器配置"""
pdf_path: str = "D:\\Sources\\DONGJAK-TOOLS\\pdfs\\Database Fundamentals.pdf"
db_connection: str = "postgresql://postgres:postgres@192.168.1.7:5432/postgres"
model_id: str = "deepseek-chat"
vector_db_path: str = "tmp/lancedb"
class DatabaseOptimizer:
"""PostgreSQL 数据库优化引擎"""
def __init__(self, config: Optional[DatabaseOptimizerConfig] = None):
self.config = config or DatabaseOptimizerConfig()
self._load_environment()
self.knowledge_base = self._setup_knowledge_base()
self.postgres_tools = self._setup_postgres_tools()
self.agent = self._create_agent()
def _setup_postgres_tools(self) -> MCPTools:
"""设置 PostgreSQL 工具"""
server_params = StdioServerParameters(
command="cmd",
args=[
"/c",
"npx",
"-y",
"@modelcontextprotocol/server-postgres",
self.config.db_connection,
],
env={},
)
# Create a client session to connect to the MCP server
with stdio_client(server_params) as (read, write):
with ClientSession(read, write) as session:
agent = create_filesystem_agent(session)
# Run the agent
agent.print_response(message, stream=True)
return MCPTools(server_params=server_params)
def analyze_database(self, query: str, stream: bool = True):
"""分析数据库"""
with self.postgres_tools:
self.agent.print_response(query, stream=stream)
async def main():
load_dotenv()
@@ -86,9 +40,20 @@ async def main():
embedder=OpenAIEmbedder(id="text-embedding-3-small"),
),
)
# Create Website knowledge base
website_kb = WebsiteKnowledgeBase(
urls=["https://www.lucidchart.com/blog/database-design-best-practices"],
max_links=10,
vector_db=LanceDb(
table_name="website_documents",
uri="tmp/lancedb",
search_type=SearchType.vector,
embedder=OpenAIEmbedder(id="text-embedding-3-small"),
),
)
knowledge_base = CombinedKnowledgeBase(
sources=[local_pdf_kb],
sources=[local_pdf_kb, website_kb],
vector_db=LanceDb(
table_name="combined_documents",
uri="tmp/lancedb",
@@ -98,31 +63,45 @@ async def main():
)
knowledge_base.load()
server_params = StdioServerParameters(
postgres_server_params = StdioServerParameters(
command="cmd",
args=[
"/c",
"npx",
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://postgres:postgres@192.168.1.7:5432/postgres",
"postgresql://postgres:postgres@192.168.1.7:5432/aq",
],
env={},
)
searxng_server_params = StdioServerParameters(
command="cmd",
args=[
"/c",
"npx",
"-y",
"https://github.com/ihor-sokoliuk/mcp-searxng.git",
],
env={
"SEARXNG_URL": "https://searchxng.ailoveworld.cn",
},
)
# Create a client session to connect to the MCP server
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
postgres_tools = MCPTools(session=session)
await postgres_tools.initialize()
agent = Agent(
model=DeepSeek(id="deepseek-chat"),
markdown=True,
knowledge=knowledge_base,
search_knowledge=True,
show_tool_calls=True,
tools=[postgres_tools],
)
await agent.aprint_response("看下aq这个数据库", stream=True)
async with (
MCPTools(server_params=postgres_server_params) as postgres_tools,
MCPTools(server_params=searxng_server_params) as searxng_tools,
):
agent = Agent(
model=DeepSeek(id="deepseek-chat"),
markdown=True,
knowledge=knowledge_base,
search_knowledge=True,
show_tool_calls=True,
tools=[postgres_tools, searxng_tools],
)
await agent.aprint_response("帮我分析一下aq.public数据库,并给出优化建议", stream=True)
# await agent.aprint_response("阅读下 https://www.lucidchart.com/blog/database-design-best-practices 这篇文章", stream=True)
if __name__ == "__main__":