avatar

mdo

Hello

  • 首页
  • 知识库
  • 归档
  • 标签
  • 关于
主页 ThinkPHP 框架向量扫描
文章

ThinkPHP 框架向量扫描

发表于 30天前 更新于 30天前
作者 mdo
13~17 分钟 阅读

针对 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
分享

相关文章

10月 7, 2026

比尔盖茨的智慧:想多赚钱,就每天循环做这3件事

我们总有一种非常固执的错觉,认为那些站在财富金字塔顶端的人,必然拥有某种超越常人的特异功能。我们在脑海中给比尔盖茨这样的大佬描绘了一幅极其悲壮的奋斗画像。大家总觉得,他之所以能富可敌国,肯定是因为他每天只睡三个小时,同时对着八个电脑屏幕疯狂敲击键盘,每一秒钟都在做出价值几亿美金的生死抉择。 为了模仿

9月 28, 2026

程序员越想创业,越不要急着动手

一个能源方面的前辈找到我,希望通过我把一些人工的工作 AI 自动化。 能源方面我不懂,找 Gemini 聊完发现这个是可以复制的,非常兴奋。我跟老婆说,这个项目做好以后可以做成平台,推广到其他公司,你就等着做总裁夫人吧! 她听完以后跟我说,这个项目还是太定制化,和我之前做的一个项目很像。 那个项目一

9月 25, 2026

忍了一年多,我终于对i18n下手了过去一年,我主要参与国际机票业务的开发工作,因此每天都要和多语言(i18n)打交道

前言 大家好,我是奈德丽。 过去一年,我主要参与国际机票业务的开发工作,因此每天都要和多语言(i18n)打交道。熟悉我的朋友都知道,我这个人比较“惜力”(并不是,实际上只是忍不下去了),对于重复笨拙的工作非常抵触,于是,我开始思考如何优化团队的多语言管理模式。 痛点背景 先说说我们在机票项目中遇到的

下一篇

crewai 扫描项目 形成向量数据库

上一篇

在渭南 一家三口每月消费水平

最近更新

  • 比尔盖茨的智慧:想多赚钱,就每天循环做这3件事
  • iOS 侧载(Sideloading)工具
  • 程序员越想创业,越不要急着动手
  • 注册 Chat Participant
  • 中秋给在外游子的一封信

热门标签

API CodeGeex Coding Cursor DeepSeek Docker Gitkraken Harness Laravel Management

目录

©2026 mdo. 保留部分权利。