ThinkPHP 框架向量扫描
针对 ThinkPHP 框架(如 TP5、TP6 或最新的 TP8),项目目录结构有其特定的规范。为了避免把运行时缓存、模板缓存、日志文件以及公共静态资源(如 CSS/JS)也扫进向量数据库,我们需要在过滤器中针对 ThinkPHP 的经典结构进行精细化剪裁:
保留:
app/(应用核心逻辑)、config/(配置文件)、route/(路由定义)、extend/(扩展类库)。排除:
runtime/(缓存与日志)、public/(静态资源)、vendor/(Composer 依赖)。
以下是专为 ThinkPHP 项目 定制的 CrewAI 扫描与向量库构建方案:
🛠️ 1. 环境依赖准备
请确保在环境中安装了以下基础包:
bash
pip install crewai crewai-tools langchain-openai langchain-community chromadb tree-sitter tree-sitter-php
请谨慎使用此类代码。
📂 2. ThinkPHP 专属扫描脚本
你可以创建 ingest_tp_project.py,并将以下代码粘贴进去运行:
python
import os
from pathlib import Path
from crewai import Agent, Task, Crew, Process
from crewai.tools import tool
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_community.document_loaders import GenericLoader
from langchain_community.document_loaders.parsers import LanguageParser
from langchain.text_splitter import LanguageSplitter
# 1. 配置您的 OpenAI API 密钥
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
# 2. 定义 ThinkPHP 专属扫描工具
@tool("ThinkPHP Project Scanner and Vector DB Creator")
def scan_tp_project_to_vector_db(project_path: str, db_persist_path: str) -> str:
"""
专门扫描 ThinkPHP 框架项目。
保留 app, config, route, extend 目录,严格过滤 runtime, vendor, public 等非逻辑目录。
"""
try:
path = Path(project_path)
if not path.exists():
return f"错误:项目路径 {project_path} 不存在。"
print(f"🔍 正在扫描 ThinkPHP 项目: {project_path} ...")
# 使用通用加载器解析,并针对 ThinkPHP 目录特性进行精准过滤
loader = GenericLoader.from_filesystem(
path,
glob="**/*",
suffixes=[".php", ".json"], # 主要扫描 PHP 源码和配置文件
exclude=[
"**/vendor/**", # 排除 Composer 依赖包
"**/runtime/**", # 严格排除 ThinkPHP 的运行时缓存、日志、Session
"**/public/**", # 排除前端静态资源及入口文件(如不含核心逻辑的 index.php)
"**/.git/**", # 排除 Git 目录
"**/.idea/**", # 排除 IDE 配置
"**/database/migrations/**" # 可选:排除数据库迁移脚本(如果不需要针对表结构建索引)
],
parser=LanguageParser(language="php", parser_threshold=150)
)
documents = loader.load()
if not documents:
return "未找到任何有效的 ThinkPHP 核心代码文件。"
# 针对 PHP 语法进行智能切片(保持 Controller、Model、Service 类的完整性)
splitter = LanguageSplitter.from_language(language="php", chunk_size=1500, chunk_overlap=150)
texts = splitter.split_documents(documents)
print(f"📊 成功将 ThinkPHP 项目切分为 {len(texts)} 个代码块。")
# 初始化向量模型并写入数据库
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
print("🚀 正在生成向量并写入 Chroma 数据库...")
vector_db = Chroma.from_documents(
documents=texts,
embedding=embeddings,
persist_directory=db_persist_path
)
return f"🎉 成功!ThinkPHP 项目已转换为向量库。保存路径:{db_persist_path}"
except Exception as e:
return f"❌ 执行失败,错误信息: {str(e)}"
# 3. 组装 CrewAI Agent 与 Task
tp_architect = Agent(
role="ThinkPHP 架构专家",
goal="精细化扫描 ThinkPHP 项目,精准提取 Controller、Model、Middleware 以及路由配置并建立向量索引。",
backstory="你是一位精通 ThinkPHP 框架(从 TP5 到 TP8)的资深架构师。你对 ThinkPHP 的 MVC 架构、中间件、门面(Facade)、模型关联等机制了如指掌。你懂得过滤掉大量的垃圾缓存和依赖文件,只对业务核心代码建库。",
tools=[scan_tp_project_to_vector_db],
verbose=True
)
scan_task = Task(
description="扫描位于 '{project_dir}' 的 ThinkPHP 项目。过滤掉 runtime 和 vendor 等无关目录,将核心代码转换为向量库并存至 '{vector_db_dir}'。",
expected_output="一份包含成功状态、切片数量、和最终数据库保存路径的执行报告。",
agent=tp_architect
)
tp_project_crew = Crew(
agents=[tp_architect],
tasks=[scan_task],
process=Process.sequential
)
# 4. 运行
if __name__ == "__main__":
result = tp_project_crew.kickoff(inputs={
"project_dir": "./my_thinkphp_project", # 替换为你的 ThinkPHP 项目实际路径
"vector_db_dir": "./tp_project_vdb" # 向量库输出路径
})
print("\n--- 执行结果 ---")
print(result)
请谨慎使用此类代码。
💡 3. 实战:如何用 Agent 分析你的 ThinkPHP 代码?
数据库建好后,你可以用下面的代码段实例化一个 ThinkPHP 专属 AI 助手,用来分析项目业务:
python
from crewai import Agent, Task, Crew
from crewai_tools import ChromaSearchTool
# 1. 载入刚刚生成的 ThinkPHP 向量工具
tp_search_tool = ChromaSearchTool(
chroma_folder_path="./tp_project_vdb"
)
# 2. 定义一个懂 TP 框架的审计 Agent
tp_analyst = Agent(
role="ThinkPHP 代码审计专家",
goal="结合 ThinkPHP 的架构特性,通过查询向量库快速定位路由、控制器逻辑并解答业务疑问。",
backstory="你精通 ThinkPHP 的全盘架构,能够根据用户提问,快速通过向量检索找出对应的控制器(Controller)或模型(Model)代码,并梳理出业务流程。",
tools=[tp_search_tool],
verbose=True
)
# 3. 提问任务(例如:分析订单模块或中间件)
audit_task = Task(
description="请帮我查一下,这个项目里的‘用户注册’(Register)逻辑是在哪个控制器里实现的?有没有使用到验证器(Validate)或中间件(Middleware)?请列出具体的文件路径和核心逻辑。",
expected_output="一份关于注册逻辑的文件路径清单、涉及的 TP 特性(如验证器、中间件)及核心代码流程解析。",
agent=tp_analyst
)
# 运行审计
Crew(agents=[tp_analyst], tasks=[audit_task]).kickoff()
请谨慎使用此类代码。
如果项目比较敏感或为了节约成本,你想把方案里的 OpenAI 嵌入模型替换为完全免费的本地轻量化向量模型(如通过 Ollama 运行本地模型,不需要 API Key),可以让我知道,我为你提供对应的本地代码改动方案。
许可协议:
CC BY 4.0