Skip to content

Commit

Permalink
lambda for RAG
Browse files Browse the repository at this point in the history
  • Loading branch information
Rushil Daya authored and Rushil Daya committed Feb 19, 2024
1 parent 21df288 commit c7ee7a6
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 8 deletions.
16 changes: 16 additions & 0 deletions backend/deploy_lambda_retrieval_and_generation.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#!/bin/sh
rm -rf package
rm package.zip
mkdir -p package
pip install -r requirements-lambda.txt --force-reinstall --target ./package --only-binary=:all: --platform manylinux1_x86_64 --upgrade
pip install pydantic --force-reinstall --target ./package --only-binary=:all: --platform manylinux1_x86_64 --upgrade
pip install pydantic_core --force-reinstall --target ./package --only-binary=:all: --platform manylinux1_x86_64 --upgrade
cd package q
zip -r ../package.zip .
cd ..
zip package.zip lambda_function_retrieval_and_generation.py
zip package.zip config.py
zip -r package.zip src
aws --profile $AWS_PROFILE_NAME --region eu-central-1 lambda update-function-code \
--function-name electionsAIRetrievalAndGeneration \
--zip-file fileb://package.zip
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ pip install -r requirements-lambda.txt --force-reinstall --target ./package
cd package
zip -r ../package.zip .
cd ..
zip package.zip lambda_function.py
zip package.zip lambda_function_retrieval_only.py
zip package.zip config.py
zip -r package.zip src
aws --profile $AWS_PROFILE_NAME --region eu-central-1 lambda update-function-code \
Expand Down
37 changes: 37 additions & 0 deletions backend/lambda_function_retrieval_and_generation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from src.bedrock import retrieve_bedrock_items, re_reference, BedrockRetrievedItem
from src.llm import decisions_query
from config import BEDROCK_KNOWLEDGE_BASE_ID
import json
from typing import Optional

def lambda_handler(event: dict, context: Optional[dict] = None):

query = event["query"]

if len(query) < 10:
return {"statusCode": 400, "body": json.dumps("Vraag niet lang genoeg.")}
if len(query) > 500:
return {"statusCode": 400, "body": json.dumps("Vraag te lang.")}

retrieved_items = retrieve_bedrock_items(BEDROCK_KNOWLEDGE_BASE_ID, query, 10)
llm_response = decisions_query(query, retrieved_items)
re_referenced_llm_response, used_decisions = re_reference(llm_response, retrieved_items)

used_decisions_dicts = []
for decision in used_decisions:
used_decisions_dicts.append({
"text": decision.text,
"decision_url": decision.decision_url,
"title": decision.title,
"meeting_date": decision.meeting_date,
"score": decision.score
})

return {"statusCode": 200, "body": json.dumps({"response":re_referenced_llm_response,"decisions":used_decisions_dicts})}

if __name__ == "__main__":
response = lambda_handler({
"query": "wat heeft de regering gedaan om de economie te stimuleren?"
}
)
print(response)
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ def lambda_handler(event: dict, context: Optional[dict] = None):
if len(event["query"]) < 10:
return {"statusCode": 400, "body": json.dumps("Vraag niet lang genoeg.")}

if len(event["query"]) > 1000:
if len(event["query"]) > 500:
return {"statusCode": 400, "body": json.dumps("Vraag te lang.")}

response = retrieve_bedrock_items(
Expand Down
3 changes: 2 additions & 1 deletion backend/requirements-lambda.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
boto3
python-dateutil
python-dateutil
openai
12 changes: 7 additions & 5 deletions backend/src/llm.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
from typing import Optional
import openai
import tiktoken
from config import OPENAI_API_KEY, OPENAI_MODEL_NAME
from src.vector_store import VectorDBItem
from src.bedrock import BedrockRetrievedItem
# TODO: Bedrock items and vector db items need to combined into a single type

client = openai.OpenAI(
api_key=OPENAI_API_KEY
)

encoding = tiktoken.encoding_for_model(OPENAI_MODEL_NAME)

def get_response(prompt:str, model_overide=None)->str:
api_response = client.chat.completions.create(
Expand All @@ -26,9 +23,15 @@ def get_response(prompt:str, model_overide=None)->str:
return api_response.choices[0].message.content

def token_count(text:str)->int:
# tiktoken is not playing nicely on aws lambda so we need to do this
# workaround to avoid importing it
import tiktoken
encoding = tiktoken.encoding_for_model(OPENAI_MODEL_NAME)
return len(encoding.encode(text))

def generate_prompt_for_decision_consult(topic_text:str, matching_decisions:list[VectorDBItem], max_tokens: int)->str:
def generate_prompt_for_decision_consult(topic_text:str, matching_decisions, max_tokens: int)->str:
# we can't put a type on the decisions here because it requires importing from the vector db module
# and this is giving a problem when building the lambda... when there time - fix this
flat_decisions = [f"{index} - {item.text}" for index, item in enumerate(matching_decisions)]

prompt_instruction = """
Expand Down Expand Up @@ -92,7 +95,6 @@ def decisions_query(query:str, decisions:list[BedrockRetrievedItem])->str:
vraag:{query}
Jou antwoord:
"""
print(f"full prompt contains: {token_count(prompt)} tokens")
return get_response(prompt)


Expand Down

0 comments on commit c7ee7a6

Please sign in to comment.