Skip to content

Commit

Permalink
Update llama_index (#21)
Browse files Browse the repository at this point in the history
* Update llama_index

* Fix trigger

* Update pipeline stuff

* Rebuild index and transparent model settings

* Compile requirements

* Use compiled reqs

* Modify dockerfile
  • Loading branch information
selamanse committed Jan 26, 2024
1 parent 824054a commit 1ab7a5a
Show file tree
Hide file tree
Showing 11 changed files with 275 additions and 46 deletions.
43 changes: 15 additions & 28 deletions .github/workflows/build_and_deploy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@ on:
push:
branches:
- main
paths:
- "!jupyter/**"
- "!ui/**"
paths-ignore:
- "jupyter/**"
- "ui/**"
pull_request:
branches:
- main
paths:
- "!jupyter/**"
- "!ui/**"
paths-ignore:
- "jupyter/**"
- "ui/**"

env:
GCLOUD_PROJECT_ID: ${{ secrets.GCLOUD_PROJECT_ID }}
Expand All @@ -26,44 +26,37 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: "3.10"
- uses: actions/cache@v3
python-version: "3.11"
- uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ hashFiles('requirements.txt') }}
- name: Run tests
run: |
python -m pip install --upgrade pip
pip install ruff pytest
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
if [ -f requirements-all.txt ]; then pip install -r requirements-all.txt; fi
pytest --junitxml=test_results.xml
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
- id: "auth"
uses: "google-github-actions/auth@v1"
uses: "google-github-actions/auth@v2"
with:
credentials_json: "${{ secrets.GCLOUD_SA_KEY }}"
- name: Setup Google Cloud CLI
if: ${{ (github.ref == 'refs/heads/main') || (startsWith(github.ref, 'refs/tags/')) }}
uses: google-github-actions/setup-gcloud@v1
uses: google-github-actions/setup-gcloud@v2
with:
version: ">= 363.0.0"
version: "latest"
- name: Docker Login
if: ${{ (github.ref == 'refs/heads/main') || (startsWith(github.ref, 'refs/tags/')) }}
run: |
gcloud auth configure-docker europe-west3-docker.pkg.dev
- name: Build for verification
if: github.ref != 'refs/heads/main'
env:
GH_DEPLOY_USERNAME: ${{ env.GITHUB_REPOSITORY_OWNER }}
GH_DEPLOY_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: echo "implement me"
- name: Build And Push Docker Image
uses: docker/build-push-action@v4
uses: docker/build-push-action@v5
with:
context: .
push: ${{ (github.ref == 'refs/heads/main') || (startsWith(github.ref, 'refs/tags/')) }}
Expand All @@ -85,12 +78,6 @@ jobs:
echo "Invoke endpoint:"
gcloud run services list --platform managed --format json | jq -r \
'.[] | select(.metadata.name == "google-cloud-run-maven-test") | .status.address.url'
- name: Release
uses: fnkr/github-action-ghr@v1
if: startsWith(github.ref, 'refs/tags/')
env:
GHR_PATH: build/distributions
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Publish Test Results
uses: EnricoMi/publish-unit-test-result-action@v2
if: always()
Expand Down
6 changes: 3 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
FROM python:3.10-slim-bullseye
FROM python:3.11-slim-bookworm

LABEL org.opencontainers.image.source = "https://github.com/deepshore/knowledge-chatbot"

WORKDIR /app

COPY requirements.txt /app/
COPY requirements-all.txt /app/
COPY app/main.py /app/
COPY storage /app/storage

RUN python -m pip install --upgrade pip && \
pip install -r requirements.txt
pip install -r requirements-all.txt

CMD uvicorn main:app --port 8080 --host 0.0.0.0
46 changes: 35 additions & 11 deletions app/main.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,24 @@
from contextlib import asynccontextmanager
from fastapi import FastAPI
from fastapi import FastAPI, status
import os
import logging
import sys
from llama_index import StorageContext, load_index_from_storage
from llama_index import StorageContext, ServiceContext, load_index_from_storage, set_global_service_context, VectorStoreIndex
from llama_index.llms import OpenAI
from llama_index.embeddings import OpenAIEmbedding
from llama_index.embeddings.openai import OpenAIEmbeddingMode, OpenAIEmbeddingModelType
from pydantic import BaseModel
from typing import Union
from llama_index.response.schema import Response
from llama_hub.web.sitemap.base import SitemapReader

logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))

llm = OpenAI(model="gpt-3.5-turbo")
embed_model = OpenAIEmbedding(mode=OpenAIEmbeddingMode.TEXT_SEARCH_MODE, model=OpenAIEmbeddingModelType.TEXT_EMBED_ADA_002)
service_context = ServiceContext.from_defaults(llm=llm,
embed_model=embed_model)
set_global_service_context(service_context=service_context)

class DeepshoreChatRequest(BaseModel):
question: str
timestamp: Union[int, None] = None
Expand All @@ -25,26 +33,42 @@ class DeepshoreChatResponse(BaseModel):
# todo: put this into lifespan startup and add async tests
index = None

persist_dir = './storage' if (os.environ.get('PERSIST_DIR') == None) else os.environ.get('PERSIST_DIR')
storage_context = StorageContext.from_defaults(persist_dir=persist_dir)
# load index
index = load_index_from_storage(storage_context)
print("PEEN")
def refresh_index():
global index
print("refresh_index")
loader = SitemapReader(html_to_text=True)
documents = loader.load_data(sitemap_url='https://deepshore.de/sitemap.xml', filter='https://deepshore.de/knowledge')
index = VectorStoreIndex.from_documents(documents)
index.storage_context.persist()

try:
persist_dir = './storage' if (os.environ.get('PERSIST_DIR') == None) else os.environ.get('PERSIST_DIR')
storage_context = StorageContext.from_defaults(persist_dir=persist_dir)
# load index
index = load_index_from_storage(storage_context)
except Exception as err:
print(err)
refresh_index()

if not index:
raise Exception("Sorry, no numbers below zero")

# app start

app = FastAPI()

app.name = "Deepshore Chatbot API"

@app.get("/")
async def read_root():
return {"message": "Deepshore Chatbot API"}

@app.put("/refresh-index", status_code=status.HTTP_204_NO_CONTENT)
async def get_refresh_index():
global index
refresh_index()

@app.post("/chatbot")
async def ask_chatbot(request: DeepshoreChatRequest):
global index
try:
query_engine = index.as_query_engine()
response = query_engine.query(request.question)
Expand Down
8 changes: 8 additions & 0 deletions app/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from .main import app
from .main import DeepshoreChatRequest
import time
import pytest

client = TestClient(app)

Expand All @@ -10,6 +11,13 @@ def test_read_root():
assert response.status_code == 200
assert response.json() == {"message": "Deepshore Chatbot API"}

@pytest.mark.skip(reason="this should be tested individually beacuse it really scrapes the site and generates the index")
def test_get_refresh_index():
import nest_asyncio
nest_asyncio.apply()
response = client.put("/refresh-index")
assert response.status_code == 204

def test_post_chatbot():
ts = int(time.time())
req = {"question": "Was ist k6.io?", "timestamp": ts}
Expand Down
7 changes: 7 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
version: '3'
services:
app:
build: .
ports:
- "8080:8080"
env_file: .env
Loading

0 comments on commit 1ab7a5a

Please sign in to comment.