♻️ refactor(代码): 重构数据库优化器逻辑
- 移除不必要的DatabaseOptimizer类及其配置 - 添加WebsiteKnowledgeBase以支持网页知识库 - 优化MCPTools的使用,合并多个工具的初始化
This commit is contained in:
105
数据库优化工程师.py
105
数据库优化工程师.py
@@ -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__":
|
||||
|
||||
Reference in New Issue
Block a user