mirror of
https://github.com/aimingmed/aimingmed-ai.git
synced 2026-02-06 23:35:28 +08:00
update
This commit is contained in:
parent
1942039f3b
commit
cdff0df5f5
0
app/backend/.dockerignore
Normal file
0
app/backend/.dockerignore
Normal file
23
app/backend/Dockerfile
Normal file
23
app/backend/Dockerfile
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# pull official base image
|
||||||
|
FROM python:3.11-slim
|
||||||
|
|
||||||
|
# set working directory
|
||||||
|
WORKDIR /usr/src/app
|
||||||
|
|
||||||
|
# set environment variables
|
||||||
|
ENV PYTHONDONTWRITEBYTECODE 1
|
||||||
|
ENV PYTHONUNBUFFERED 1
|
||||||
|
|
||||||
|
# install system dependencies
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get -y install build-essential netcat-traditional gcc postgresql \
|
||||||
|
&& apt-get clean
|
||||||
|
|
||||||
|
# install python dependencies
|
||||||
|
RUN pip install --upgrade pip setuptools wheel -i https://pypi.tuna.tsinghua.edu.cn/simple
|
||||||
|
RUN pip install pipenv -i https://pypi.tuna.tsinghua.edu.cn/simple
|
||||||
|
COPY ./Pipfile .
|
||||||
|
RUN pipenv install --deploy --dev
|
||||||
|
|
||||||
|
# add app
|
||||||
|
COPY . .
|
||||||
23
app/backend/Pipfile
Normal file
23
app/backend/Pipfile
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
[[source]]
|
||||||
|
url = "https://pypi.org/simple"
|
||||||
|
verify_ssl = true
|
||||||
|
name = "pypi"
|
||||||
|
|
||||||
|
[packages]
|
||||||
|
fastapi = "*"
|
||||||
|
pydantic = "*"
|
||||||
|
uvicorn = "*"
|
||||||
|
pydantic-settings = "==2.1.0"
|
||||||
|
|
||||||
|
[dev-packages]
|
||||||
|
httpx = "==0.26.0"
|
||||||
|
pytest = "==7.4.4"
|
||||||
|
pytest-cov = "==4.1.0"
|
||||||
|
pytest-mock = "==3.10.0"
|
||||||
|
flake8 = "==7.0.0"
|
||||||
|
black = "==23.12.1"
|
||||||
|
isort = "==5.13.2"
|
||||||
|
ipykernel = "*"
|
||||||
|
|
||||||
|
[requires]
|
||||||
|
python_version = "3.11"
|
||||||
1090
app/backend/Pipfile.lock
generated
Normal file
1090
app/backend/Pipfile.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
15
app/backend/api/ping.py
Normal file
15
app/backend/api/ping.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
from fastapi import APIRouter, Depends
|
||||||
|
|
||||||
|
from config import get_settings, Settings
|
||||||
|
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
|
|
||||||
|
|
||||||
|
@router.get("/ping")
|
||||||
|
async def pong(settings: Settings = Depends(get_settings)):
|
||||||
|
return {
|
||||||
|
"ping": "pong!",
|
||||||
|
"environment": settings.environment,
|
||||||
|
"testing": settings.testing
|
||||||
|
}
|
||||||
10
app/backend/api/query.py
Normal file
10
app/backend/api/query.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from typing import List
|
||||||
|
|
||||||
|
from fastapi import APIRouter
|
||||||
|
|
||||||
|
from models.adaptive_rag.router import RouteQuery
|
||||||
|
from models.adaptive_rag.grading import GradeAnswer, GradeDocuments, GradeHallucinations
|
||||||
|
|
||||||
|
router = APIRouter()
|
||||||
|
|
||||||
|
@router.post("/", response_model=SummaryResponseSchema, status_code=201)
|
||||||
18
app/backend/config.py
Normal file
18
app/backend/config.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import logging
|
||||||
|
from functools import lru_cache
|
||||||
|
|
||||||
|
from pydantic_settings import BaseSettings
|
||||||
|
|
||||||
|
|
||||||
|
log = logging.getLogger("uvicorn")
|
||||||
|
|
||||||
|
|
||||||
|
class Settings(BaseSettings):
|
||||||
|
environment: str = "dev"
|
||||||
|
testing: bool = 0
|
||||||
|
|
||||||
|
|
||||||
|
@lru_cache()
|
||||||
|
def get_settings() -> BaseSettings:
|
||||||
|
log.info("Loading config settings from the environment...")
|
||||||
|
return Settings()
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
import logging
|
||||||
|
|
||||||
|
from fastapi import FastAPI, Depends
|
||||||
|
|
||||||
|
from config import get_settings, Settings
|
||||||
|
|
||||||
|
from api import ping, query
|
||||||
|
|
||||||
|
log = logging.getLogger("uvicorn")
|
||||||
|
|
||||||
|
|
||||||
|
def create_application() -> FastAPI:
|
||||||
|
application = FastAPI()
|
||||||
|
application.include_router(ping.router)
|
||||||
|
application.include_router(
|
||||||
|
query.router, prefix="/query", tags=["query"]
|
||||||
|
)
|
||||||
|
|
||||||
|
return application
|
||||||
|
|
||||||
|
|
||||||
|
app = create_application()
|
||||||
|
|
||||||
|
|
||||||
23
app/backend/models/adaptive_rag/grading.py
Normal file
23
app/backend/models/adaptive_rag/grading.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
|
|
||||||
|
class GradeDocuments(BaseModel):
|
||||||
|
"""Binary score for relevance check on retrieved documents."""
|
||||||
|
|
||||||
|
binary_score: str = Field(
|
||||||
|
description="Documents are relevant to the question, 'yes' or 'no'"
|
||||||
|
)
|
||||||
|
|
||||||
|
class GradeHallucinations(BaseModel):
|
||||||
|
"""Binary score for hallucination present in generation answer."""
|
||||||
|
|
||||||
|
binary_score: str = Field(
|
||||||
|
description="Answer is grounded in the facts, 'yes' or 'no'"
|
||||||
|
)
|
||||||
|
|
||||||
|
class GradeAnswer(BaseModel):
|
||||||
|
"""Binary score to assess answer addresses question."""
|
||||||
|
|
||||||
|
binary_score: str = Field(
|
||||||
|
description="Answer addresses the question, 'yes' or 'no'"
|
||||||
|
)
|
||||||
5
app/backend/models/adaptive_rag/output.py
Normal file
5
app/backend/models/adaptive_rag/output.py
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
class final_answer(BaseModel):
|
||||||
|
"""Final answer to be returned to the user."""
|
||||||
|
answer: str
|
||||||
11
app/backend/models/adaptive_rag/router.py
Normal file
11
app/backend/models/adaptive_rag/router.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from typing import Literal
|
||||||
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
|
|
||||||
|
class RouteQuery(BaseModel):
|
||||||
|
"""Route a user query to the most relevant datasource."""
|
||||||
|
|
||||||
|
datasource: Literal["vectorstore", "web_search"] = Field(
|
||||||
|
...,
|
||||||
|
description="Given a user question choose to route it to web search or a vectorstore.",
|
||||||
|
)
|
||||||
0
app/backend/tests/__init__.py
Normal file
0
app/backend/tests/__init__.py
Normal file
23
app/backend/tests/conftest.py
Normal file
23
app/backend/tests/conftest.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
from starlette.testclient import TestClient
|
||||||
|
|
||||||
|
import main
|
||||||
|
from config import get_settings, Settings
|
||||||
|
|
||||||
|
|
||||||
|
def get_settings_override():
|
||||||
|
return Settings(testing=1)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(scope="module")
|
||||||
|
def test_app():
|
||||||
|
# set up
|
||||||
|
main.app.dependency_overrides[get_settings] = get_settings_override
|
||||||
|
with TestClient(main.app) as test_client:
|
||||||
|
|
||||||
|
# testing
|
||||||
|
yield test_client
|
||||||
|
|
||||||
|
# tear down
|
||||||
4
app/backend/tests/test_ping.py
Normal file
4
app/backend/tests/test_ping.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
def test_ping(test_app):
|
||||||
|
response = test_app.get("/ping")
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert response.json() == {"environment": "dev", "ping": "pong!", "testing": True}
|
||||||
@ -1,10 +1,24 @@
|
|||||||
version: "3.9"
|
version: "3.9"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
streamlit:
|
# streamlit:
|
||||||
build: ./streamlit
|
# build: ./streamlit
|
||||||
|
# platform: linux/amd64
|
||||||
|
# ports:
|
||||||
|
# - "8501:8501"
|
||||||
|
# volumes:
|
||||||
|
# - ./llmops/src/rag_cot_evaluation/chroma_db:/app/llmops/src/rag_cot_evaluation/chroma_db
|
||||||
|
|
||||||
|
backend:
|
||||||
|
build:
|
||||||
|
context: ./backend
|
||||||
|
dockerfile: Dockerfile
|
||||||
platform: linux/amd64
|
platform: linux/amd64
|
||||||
ports:
|
command: pipenv run uvicorn main:app --reload --workers 1 --host 0.0.0.0 --port 8000
|
||||||
- "8501:8501"
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./llmops/src/rag_cot_evaluation/chroma_db:/app/llmops/src/rag_cot_evaluation/chroma_db
|
- ./backend:/usr/src/app
|
||||||
|
ports:
|
||||||
|
- "8004:8000"
|
||||||
|
environment:
|
||||||
|
- ENVIRONMENT=dev
|
||||||
|
- TESTING=0
|
||||||
Loading…
x
Reference in New Issue
Block a user