From 768c1c3ce95d13bc1c59af9088aee0856668975a Mon Sep 17 00:00:00 2001 From: jhy <184825448@qq.com> Date: Thu, 15 Oct 2026 13:05:10 +0800 Subject: [PATCH] chore: initialize fullstack starter and team guidelines --- .gitignore | 10 ++++++ README.md | 50 +++++++++++++++++++++++++++++ backend/.env.example | 5 +++ backend/app/__init__.py | 0 backend/app/api/__init__.py | 0 backend/app/api/routes/__init__.py | 0 backend/app/api/routes/chat.py | 7 ++++ backend/app/api/routes/health.py | 5 +++ backend/app/api/routes/knowledge.py | 15 +++++++++ backend/app/core/__init__.py | 0 backend/app/core/config.py | 14 ++++++++ backend/app/db/__init__.py | 0 backend/app/db/session.py | 16 +++++++++ backend/app/main.py | 25 +++++++++++++++ backend/app/models/__init__.py | 1 + backend/app/models/knowledge.py | 14 ++++++++ backend/app/schemas/__init__.py | 0 backend/app/schemas/chat.py | 13 ++++++++ backend/app/schemas/knowledge.py | 18 +++++++++++ backend/requirements.txt | 7 ++++ docker-compose.yml | 20 ++++++++++++ docs/ARCHITECTURE.md | 20 ++++++++++++ docs/CONTRIBUTING.md | 37 +++++++++++++++++++++ docs/DECISIONS.md | 16 +++++++++ docs/DEVELOPMENT_PLAN.md | 23 +++++++++++++ docs/PROJECT_CHARTER.md | 13 ++++++++ docs/TASKS.md | 16 +++++++++ frontend/index.html | 1 + frontend/package.json | 6 ++++ frontend/src/App.vue | 20 ++++++++++++ frontend/src/api.ts | 4 +++ frontend/src/main.ts | 4 +++ frontend/src/style.css | 2 ++ frontend/tsconfig.app.json | 1 + frontend/tsconfig.json | 1 + frontend/tsconfig.node.json | 1 + frontend/vite.config.ts | 3 ++ 37 files changed, 388 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 backend/.env.example create mode 100644 backend/app/__init__.py create mode 100644 backend/app/api/__init__.py create mode 100644 backend/app/api/routes/__init__.py create mode 100644 backend/app/api/routes/chat.py create mode 100644 backend/app/api/routes/health.py create mode 100644 backend/app/api/routes/knowledge.py create mode 100644 backend/app/core/__init__.py create mode 100644 backend/app/core/config.py create mode 100644 backend/app/db/__init__.py create mode 100644 backend/app/db/session.py create mode 100644 backend/app/main.py create mode 100644 backend/app/models/__init__.py create mode 100644 backend/app/models/knowledge.py create mode 100644 backend/app/schemas/__init__.py create mode 100644 backend/app/schemas/chat.py create mode 100644 backend/app/schemas/knowledge.py create mode 100644 backend/requirements.txt create mode 100644 docker-compose.yml create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/CONTRIBUTING.md create mode 100644 docs/DECISIONS.md create mode 100644 docs/DEVELOPMENT_PLAN.md create mode 100644 docs/PROJECT_CHARTER.md create mode 100644 docs/TASKS.md create mode 100644 frontend/index.html create mode 100644 frontend/package.json create mode 100644 frontend/src/App.vue create mode 100644 frontend/src/api.ts create mode 100644 frontend/src/main.ts create mode 100644 frontend/src/style.css create mode 100644 frontend/tsconfig.app.json create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.node.json create mode 100644 frontend/vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2b2678b --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.env +.venv/ +__pycache__/ +*.py[cod] +.pytest_cache/ +node_modules/ +dist/ +.vscode/ +.idea/ +*.log diff --git a/README.md b/README.md new file mode 100644 index 0000000..f55a393 --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +# 那拉提文旅智能问答:前后端基础壳子 + +基础工程骨架:Vue 3 + TypeScript + Vite 前端;FastAPI + Pydantic + SQLAlchemy 后端;PostgreSQL + pgvector 数据库配置。 + +## 启动数据库 +需要 Docker Desktop,在项目根目录运行: +```bash +docker compose up -d db +``` +开发数据库默认仅绑定 127.0.0.1:5432。请在正式使用前修改默认密码。 + +## 启动后端(Windows PowerShell) +```powershell +cd backend +py -3.11 -m venv .venv +.\.venv\Scripts\Activate.ps1 +pip install -r requirements.txt +Copy-Item .env.example .env +uvicorn app.main:app --reload +``` +API 文档:http://127.0.0.1:8000/docs + +## 启动前端(另开终端) +```powershell +cd frontend +npm install +npm run dev +``` +Vite 通常使用 http://localhost:5173。 + +## 已有接口 +- GET `/api/health` +- POST `/api/chat`:占位接口,尚未接入检索和 LLM +- GET `/api/knowledge` +- POST `/api/knowledge` + +前端包括问答、知识库管理、来源与更新、实验评估四个页面。实验评估页面没有虚构数据;所有页面明确标记当前功能状态。 + +注意:当前没有实现 Embedding、RAG、网络搜索、后台更新任务、用户认证或生产级数据库迁移。下一步建议先验证前后端联通,再按模块实现。`.env` 不要提交到 Git。 + +## 团队协作文档 + +- [项目章程](docs/PROJECT_CHARTER.md) +- [开发计划](docs/DEVELOPMENT_PLAN.md) +- [共同开发规范](docs/CONTRIBUTING.md) +- [系统架构](docs/ARCHITECTURE.md) +- [任务分工](docs/TASKS.md) +- [技术决策](docs/DECISIONS.md) + +目标 Gitea 仓库:`https://gitea.kronecker.cc/saint/border-red-post-nalati`。 diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 0000000..aa41b80 --- /dev/null +++ b/backend/.env.example @@ -0,0 +1,5 @@ +APP_NAME=Nalati Tourism QA API +APP_ENV=development +API_PREFIX=/api +DATABASE_URL=postgresql+psycopg://nalati:change-this-password@127.0.0.1:5432/nalati_rag +CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173 diff --git a/backend/app/__init__.py b/backend/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/api/__init__.py b/backend/app/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/api/routes/__init__.py b/backend/app/api/routes/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/api/routes/chat.py b/backend/app/api/routes/chat.py new file mode 100644 index 0000000..c601685 --- /dev/null +++ b/backend/app/api/routes/chat.py @@ -0,0 +1,7 @@ +from fastapi import APIRouter +from app.schemas.chat import ChatRequest, ChatResponse +router = APIRouter(tags=["chat"]) +@router.post("/chat", response_model=ChatResponse) +def chat(payload: ChatRequest) -> ChatResponse: + # TODO: retrieval -> context assembly -> LLM -> evidence/source checks + return ChatResponse(answer=f"已收到问题:{payload.question}。当前为基础壳子,尚未接入知识检索或大语言模型。", status="stub", sources=[]) diff --git a/backend/app/api/routes/health.py b/backend/app/api/routes/health.py new file mode 100644 index 0000000..cbfebf6 --- /dev/null +++ b/backend/app/api/routes/health.py @@ -0,0 +1,5 @@ +from fastapi import APIRouter +router = APIRouter(tags=["health"]) +@router.get("/health") +def health(): + return {"status": "ok", "service": "nalati-rag-api"} diff --git a/backend/app/api/routes/knowledge.py b/backend/app/api/routes/knowledge.py new file mode 100644 index 0000000..e97bb4a --- /dev/null +++ b/backend/app/api/routes/knowledge.py @@ -0,0 +1,15 @@ +from fastapi import APIRouter, Depends +from sqlalchemy import select +from sqlalchemy.orm import Session +from app.db.session import get_db +from app.models.knowledge import KnowledgeItem +from app.schemas.knowledge import KnowledgeCreate, KnowledgeRead +router = APIRouter(tags=["knowledge"]) +@router.get("/knowledge", response_model=list[KnowledgeRead]) +def list_knowledge(db: Session = Depends(get_db)): + return list(db.scalars(select(KnowledgeItem).order_by(KnowledgeItem.id.desc())).all()) +@router.post("/knowledge", response_model=KnowledgeRead, status_code=201) +def create_knowledge(payload: KnowledgeCreate, db: Session = Depends(get_db)): + item = KnowledgeItem(title=payload.title, category=payload.category, content=payload.content, source_url=str(payload.source_url) if payload.source_url else None, verification_status="pending") + db.add(item); db.commit(); db.refresh(item) + return item diff --git a/backend/app/core/__init__.py b/backend/app/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/core/config.py b/backend/app/core/config.py new file mode 100644 index 0000000..8aef48f --- /dev/null +++ b/backend/app/core/config.py @@ -0,0 +1,14 @@ +from pydantic_settings import BaseSettings, SettingsConfigDict + +class Settings(BaseSettings): + app_name: str = "Nalati Tourism QA API" + app_env: str = "development" + api_prefix: str = "/api" + database_url: str = "postgresql+psycopg://nalati:change-this-password@127.0.0.1:5432/nalati_rag" + cors_origins: str = "http://localhost:5173,http://127.0.0.1:5173" + model_config = SettingsConfigDict(env_file=".env", extra="ignore") + @property + def cors_origin_list(self) -> list[str]: + return [x.strip() for x in self.cors_origins.split(",") if x.strip()] + +settings = Settings() diff --git a/backend/app/db/__init__.py b/backend/app/db/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/db/session.py b/backend/app/db/session.py new file mode 100644 index 0000000..12aea8d --- /dev/null +++ b/backend/app/db/session.py @@ -0,0 +1,16 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import DeclarativeBase, sessionmaker +from app.core.config import settings + +class Base(DeclarativeBase): + pass + +engine = create_engine(settings.database_url, pool_pre_ping=True) +SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False) + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() diff --git a/backend/app/main.py b/backend/app/main.py new file mode 100644 index 0000000..0e8f89e --- /dev/null +++ b/backend/app/main.py @@ -0,0 +1,25 @@ +from contextlib import asynccontextmanager +from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware +from sqlalchemy import text +from app.core.config import settings +from app.db.session import Base, engine +from app.models import KnowledgeItem # noqa: F401 +from app.api.routes import health, chat, knowledge + +@asynccontextmanager +async def lifespan(app: FastAPI): + # Convenience for local bootstrap. Use Alembic migrations before production. + with engine.begin() as connection: + connection.execute(text("CREATE EXTENSION IF NOT EXISTS vector")) + Base.metadata.create_all(bind=engine) + yield + +app = FastAPI(title=settings.app_name, version="0.1.0", lifespan=lifespan) +app.add_middleware(CORSMiddleware, allow_origins=settings.cors_origin_list, allow_credentials=True, allow_methods=["*"], allow_headers=["*"]) +app.include_router(health.router, prefix=settings.api_prefix) +app.include_router(chat.router, prefix=settings.api_prefix) +app.include_router(knowledge.router, prefix=settings.api_prefix) +@app.get("/") +def root(): + return {"message": "Nalati Tourism QA API", "docs": "/docs"} diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py new file mode 100644 index 0000000..03a2db7 --- /dev/null +++ b/backend/app/models/__init__.py @@ -0,0 +1 @@ +from app.models.knowledge import KnowledgeItem diff --git a/backend/app/models/knowledge.py b/backend/app/models/knowledge.py new file mode 100644 index 0000000..d825dec --- /dev/null +++ b/backend/app/models/knowledge.py @@ -0,0 +1,14 @@ +from datetime import datetime +from sqlalchemy import DateTime, Integer, String, Text, func +from sqlalchemy.orm import Mapped, mapped_column +from app.db.session import Base + +class KnowledgeItem(Base): + __tablename__ = "knowledge_items" + id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True) + title: Mapped[str] = mapped_column(String(250), nullable=False, index=True) + category: Mapped[str] = mapped_column(String(80), nullable=False, default="未分类") + content: Mapped[str] = mapped_column(Text, nullable=False) + source_url: Mapped[str | None] = mapped_column(String(1000), nullable=True) + verification_status: Mapped[str] = mapped_column(String(30), nullable=False, default="pending") + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) diff --git a/backend/app/schemas/__init__.py b/backend/app/schemas/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/schemas/chat.py b/backend/app/schemas/chat.py new file mode 100644 index 0000000..40ccb80 --- /dev/null +++ b/backend/app/schemas/chat.py @@ -0,0 +1,13 @@ +from pydantic import BaseModel, Field + +class ChatRequest(BaseModel): + question: str = Field(min_length=1, max_length=2000) + +class SourcePreview(BaseModel): + title: str + source_url: str | None = None + +class ChatResponse(BaseModel): + answer: str + status: str + sources: list[SourcePreview] = [] diff --git a/backend/app/schemas/knowledge.py b/backend/app/schemas/knowledge.py new file mode 100644 index 0000000..69a3260 --- /dev/null +++ b/backend/app/schemas/knowledge.py @@ -0,0 +1,18 @@ +from datetime import datetime +from pydantic import BaseModel, ConfigDict, Field, HttpUrl + +class KnowledgeCreate(BaseModel): + title: str = Field(min_length=1, max_length=250) + category: str = Field(default="未分类", max_length=80) + content: str = Field(min_length=1) + source_url: HttpUrl | None = None + +class KnowledgeRead(BaseModel): + model_config = ConfigDict(from_attributes=True) + id: int + title: str + category: str + content: str + source_url: str | None + verification_status: str + created_at: datetime diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..eb450d8 --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,7 @@ +fastapi>=0.115,<1.0 +uvicorn[standard]>=0.30,<1.0 +pydantic>=2.8,<3.0 +pydantic-settings>=2.4,<3.0 +SQLAlchemy>=2.0,<3.0 +psycopg[binary]>=3.2,<4.0 +pgvector>=0.3,<1.0 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..d311e93 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,20 @@ +services: + db: + image: pgvector/pgvector:pg16 + container_name: nalati-postgres + restart: unless-stopped + environment: + POSTGRES_DB: nalati_rag + POSTGRES_USER: nalati + POSTGRES_PASSWORD: change-this-password + ports: + - "127.0.0.1:5432:5432" + volumes: + - nalati_pgdata:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U nalati -d nalati_rag"] + interval: 5s + timeout: 3s + retries: 10 +volumes: + nalati_pgdata: diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..5fb5d97 --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,20 @@ +# 系统架构 + +```text +Vue 3 + TS 前端 + | HTTP /api +FastAPI + Pydantic + |-- 知识管理 API -- PostgreSQL + |-- 问答服务 + |-- 关键词检索 + |-- Embedding 查询向量 -> pgvector 检索 + |-- 结果融合 -> 证据检查 -> LLM API + |-- 答案 + 来源 + |-- 后台更新任务(后续) + |-- 来源获取 -> 人工核验 -> 文本切分 -> 生成向量 -> 发布版本 +``` + +当前工程仅实现健康检查、知识条目新增/列表及问答占位接口;pgvector 扩展已在启动时启用,但未实现向量字段、索引和 RAG。前端来源管理与实验页为静态原型。 + +## 安全边界 +当前无认证与权限控制,仅供本机开发;正式部署前须补充登录鉴权、接口限流、数据库迁移、密钥管理、日志脱敏、CORS 收敛和 HTTPS。 diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 0000000..024a546 --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,37 @@ +# 团队共同开发规范 + +## 1. 基本原则 +所有代码、接口、配置、任务进度均以仓库为准。禁止直接在主分支上试验性开发;禁止提交真实密钥、个人数据、未经授权的数据集。每个任务有负责人、验收条件和关联 Issue。 + +## 2. 分支管理 +- `main`:稳定可演示版本,仅通过合并请求更新。 +- `dev`:阶段集成分支(创建后使用)。 +- `feat/<模块>-<描述>`:新功能,如 `feat/backend-knowledge-api`。 +- `fix/<描述>`:修复;`docs/<描述>`:文档;`test/<描述>`:测试。 + +从最新 `dev` 拉分支,完成后发 Pull Request(Gitea 可称合并请求),禁止覆盖他人提交或强制推送共享分支。初次初始化仓库时允许负责人向空仓库推送 `main`。 + +## 3. 提交信息 +使用 `feat: ...`、`fix: ...`、`docs: ...`、`refactor: ...`、`test: ...`、`chore: ...`,例如 `feat: add knowledge CRUD API`。一次提交只处理一个相对独立的主题。 + +## 4. 合并请求与代码审查 +合并前说明:需求/Issue、改动范围、测试命令及结果、截图(界面改动)、数据库变更、风险和回滚方式。至少一位非作者成员审查;无成员可审查时由负责人确认并记录。发现冲突先沟通,不直接覆盖。 + +## 5. 前后端协作 +- 所有接口以 `/api` 开头;Pydantic 定义输入输出模型。 +- 接口字段命名使用 `snake_case`,日期使用带时区的 ISO 8601;错误响应明确错误原因。 +- 新增接口须同步更新 OpenAPI 文档和前端调用层。 +- 前端不直接连接数据库、不保存服务端 API 密钥。 +- 使用 `.env.example` 记录变量名称,真实 `.env` 不入库。 + +## 6. 数据与知识质量 +- 知识须记录标题、分类、正文、来源、采集/核验时间、审核状态。 +- 未审核资料不得进入正式检索;网络搜索结果不自动等于可靠事实。 +- 模型向量按 `model/version/dimension` 管理,更新用后台任务和版本切换。 +- 测试数据与演示数据明确区分;禁止编造论文实验结果。 + +## 7. 完成定义(DoD) +代码能启动、主要功能有测试或可复现验收步骤、无明文密钥、文档同步、合并请求审查通过,才视为完成。 + +## 8. 沟通与任务 +优先在 Gitea Issues 记录任务;每周更新已完成/阻塞/下一步。技术选型变更先在 `docs/DECISIONS.md` 留痕。公共接口或数据库结构变更必须提前通知前后端负责人。 diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md new file mode 100644 index 0000000..92395b5 --- /dev/null +++ b/docs/DECISIONS.md @@ -0,0 +1,16 @@ +# 技术决策记录(ADR 简版) + +## ADR-001 前后端分离 +状态:已决定。前端 Vue 3 + TypeScript + Vite;后端 FastAPI + Pydantic。原因:团队并行开发、API 边界明确、原型可先行。 + +## ADR-002 数据库 +状态:已决定。PostgreSQL + pgvector。原因:结构化业务数据与向量检索可统一管理。首版先实现知识表,再逐步加入版本、向量与检索日志。 + +## ADR-003 Embedding +状态:待评估。采用统一 Provider 接口,在开源本地模型与云端 API 间选择。严禁混用不同模型生成的向量。 + +## ADR-004 网络搜索与 MCP +状态:延期。首版默认使用经过审核的知识库;联网搜索作为可选扩展。优先封装已有 API,不因使用 MCP 而自研协议服务。 + +## ADR-005 更新策略 +状态:设计确定、尚未实现。新文档版本后台生成向量,完成后原子发布;失败保留旧索引。 diff --git a/docs/DEVELOPMENT_PLAN.md b/docs/DEVELOPMENT_PLAN.md new file mode 100644 index 0000000..61a9f0b --- /dev/null +++ b/docs/DEVELOPMENT_PLAN.md @@ -0,0 +1,23 @@ +# 开发规划与里程碑 + +## 技术栈 +- 前端:Vue 3 + TypeScript + Vite +- 后端:FastAPI + Pydantic + SQLAlchemy +- 数据库:PostgreSQL + pgvector +- Embedding:统一接口,首版选择一种中文/多语言模型;切换模型必须重建向量索引 +- 检索:关键词基线、向量语义检索、混合检索 +- LLM:API 接入,密钥仅在服务端环境变量中 +- 网络搜索:可选扩展;候选资料必须核验后方可正式入库 + +## 阶段与验收 +| 阶段 | 交付物 | 验收标准 | +|---|---|---| +| 1 工程壳子 | 前后端、数据库、静态页面 | `/api/health` 可访问,页面正常展示,新增知识持久化 | +| 2 知识管理 | 来源、文档、审核、版本 | 新增、编辑、审核和查询有日志与来源 | +| 3 基础 RAG | 关键词检索、LLM 接口 | 可展示检索依据,知识不足时不强答 | +| 4 混合检索 | Embedding、pgvector、融合排序 | 能复现 A/B/C 三种对照方案 | +| 5 增量更新 | 后台任务、索引版本切换 | 新索引失败不影响旧版检索 | +| 6 实验与交付 | 测试集、指标、结果、软著材料 | 数据真实、过程可复现、文档与代码一致 | + +## 实验设计 +A:直接大模型;B:关键词 RAG;C:混合检索 RAG。记录正确性、来源可追溯性、知识不足问题无依据回答率、响应时间、调用成本。不得预设实验结果。 diff --git a/docs/PROJECT_CHARTER.md b/docs/PROJECT_CHARTER.md new file mode 100644 index 0000000..623beda --- /dev/null +++ b/docs/PROJECT_CHARTER.md @@ -0,0 +1,13 @@ +# 项目章程 + +## 项目定位 +项目:边疆红驿——那拉提文旅智能问答系统。论文研究方向为基于混合检索的那拉提文旅智能问答方法。以红色文化、旅游资源与民宿服务的可信知识问答为核心。 + +## 第一阶段目标 +1. 完成 Vue 3 + TypeScript 静态原型;2. FastAPI + Pydantic 与 PostgreSQL 基础接口联通;3. 建立可追溯知识条目管理;4. 完成关键词检索、向量检索、混合检索;5. 使用真实数据开展对照实验。 + +## 边界 +首版不承诺实时房态、实时价格、自动联网核验、模型训练、知识图谱或自研 MCP。演示数据必须标记,不得当作真实文旅信息或论文实验结果。 + +## 成果 +可运行软件、代码仓库、部署说明、真实测试记录、论文材料及软件著作权申请材料。结项和发表以学校与主管机构要求为准。 diff --git a/docs/TASKS.md b/docs/TASKS.md new file mode 100644 index 0000000..238a5a2 --- /dev/null +++ b/docs/TASKS.md @@ -0,0 +1,16 @@ +# 共同开发任务板(初稿) + +> 负责人暂未指定。认领后在 Gitea Issue 中补充负责人、预计完成时间和验收记录。 + +| 编号 | 模块 | 任务 | 负责人 | 状态 | +|---|---|---|---|---| +| T01 | 前端 | 验证 Vue 页面启动、补充截图 | 待分配 | 待办 | +| T02 | 后端 | 验证 FastAPI `/docs`、`/api/health` | 待分配 | 待办 | +| T03 | 数据库 | 启动 PostgreSQL 并验证知识入库 | 待分配 | 待办 | +| T04 | 文档 | 明确接口字段、知识来源审核规则 | 待分配 | 待办 | +| T05 | 知识库 | 设计 sources/documents/chunks/version 表 | 待分配 | 待办 | +| T06 | 检索 | 实现关键词检索基线 | 待分配 | 待办 | +| T07 | 向量 | 评估 Embedding 并实现 pgvector | 待分配 | 待办 | +| T08 | RAG | 集成 LLM 与来源展示 | 待分配 | 待办 | +| T09 | 实验 | 构建可核验问题集及评分规范 | 待分配 | 待办 | +| T10 | 工程 | 补充测试、Alembic、鉴权与部署 | 待分配 | 待办 | diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..f438f5f --- /dev/null +++ b/frontend/index.html @@ -0,0 +1 @@ +边疆红驿 · 那拉提文旅智能问答
diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..4ad8c9b --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,6 @@ +{ + "name": "nalati-rag-frontend", "private": true, "version": "0.1.0", "type": "module", + "scripts": {"dev": "vite", "build": "vue-tsc -b && vite build", "preview": "vite preview"}, + "dependencies": {"lucide-vue-next": "^0.468.0", "vue": "^3.5.13"}, + "devDependencies": {"@types/node": "^22.10.2", "@vitejs/plugin-vue": "^5.2.1", "typescript": "~5.7.2", "vite": "^6.0.5", "vue-tsc": "^2.2.0"} +} diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..ec1259d --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,20 @@ + +