Skip to content

Commit b3baf83

Browse files
authored
Merge pull request #23 from AET-DevOps25/feature/seperate-chat-llm
Run All LLM Calls Async and Introduce Separate LLM for Gen
2 parents 8e54cf3 + 6eeba09 commit b3baf83

File tree

5 files changed

+37
-29
lines changed

5 files changed

+37
-29
lines changed

.github/workflows/deploy_vm.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ jobs:
8888
IMAGE_TAG: ${{ env.COMMIT_SHA }}
8989
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
9090
GITHUB_ACTOR: ${{ github.actor }}
91+
OPEN_WEBUI_API_KEY_CHAT: ${{ secrets.OPEN_WEBUI_API_KEY_CHAT }}
92+
OPEN_WEBUI_API_KEY_GEN: ${{ secrets.OPEN_WEBUI_API_KEY_GEN }}
93+
LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }}
9194
run: ansible-playbook -i inventory.ini deploy/ansible/deploy.yml
9295

9396
deploy-k8s:

deploy/ansible/deploy.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
vars:
77
project_dir: /home/ubuntu/app
88
image_tag: "{{ lookup('env','IMAGE_TAG') }}"
9+
open_webui_api_key_chat: "{{ lookup('env','OPEN_WEBUI_API_KEY_CHAT') }}"
10+
open_webui_api_key_gen: "{{ lookup('env','OPEN_WEBUI_API_KEY_GEN') }}"
11+
langsmith_api_key: "{{ lookup('env','LANGSMITH_API_KEY') }}"
912

1013
tasks:
1114
- name: Ensure project directory exists

docker-compose.yml.j2

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ services:
5252
genai:
5353
image: ghcr.io/aet-devops25/team-3/genai:{{ image_tag }}
5454
restart: unless-stopped
55+
environment:
56+
- OPEN_WEBUI_API_KEY_CHAT="{{ open_webui_api_key_chat }}"
57+
- OPEN_WEBUI_API_KEY_GEN="{{ open_webui_api_key_gen }}"
58+
- LANGSMITH_TRACING=true
59+
- LANGSMITH_ENDPOINT="https://api.smith.langchain.com"
60+
- LANGSMITH_API_KEY="{{ langsmith_api_key }}"
61+
- LANGSMITH_PROJECT="studymate"
5562
networks:
5663
- proxy
5764
labels:

genAi/llm.py

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,19 @@
1818

1919

2020
class StudyLLM:
21-
llm = ChatOpenAI(
21+
# for chat
22+
chat_llm = ChatOpenAI(
2223
model="llama3.3:latest",
2324
temperature=0.5,
24-
api_key=os.getenv("OPEN_WEBUI_API_KEY"),
25+
api_key=os.getenv("OPEN_WEBUI_API_KEY_CHAT"),
26+
base_url="https://gpu.aet.cit.tum.de/api/"
27+
)
28+
29+
# For summaries, quizzes, flashcards
30+
generation_llm = ChatOpenAI(
31+
model="llama3.3:latest",
32+
temperature=0.5,
33+
api_key=os.getenv("OPEN_WEBUI_API_KEY_GEN"),
2534
base_url="https://gpu.aet.cit.tum.de/api/"
2635
)
2736

@@ -39,26 +48,9 @@ def __init__(self, doc_path: str):
3948
self.rag_helper = RAGHelper(doc_path)
4049
except Exception as e:
4150
raise ValueError(f"Error initializing RAGHelper: {e}")
42-
43-
def _chain(self, output_model: BaseModel = None):
44-
"""
45-
Construct a chain for the LLM with given configurations.
46-
47-
Args:
48-
OutputModel (BaseModel, optional): A Pydantic model for structured output.
49-
...
50-
Returns:
51-
RnnableSequence: The chain for the LLM.
52-
"""
53-
llm = self.llm
54-
55-
if output_model:
56-
llm = llm.with_structured_output(output_model)
57-
58-
return self.base_prompt_template | llm
5951

6052

61-
def prompt(self, prompt: str) -> str:
53+
async def prompt(self, prompt: str) -> str:
6254
"""
6355
Call the LLM with a given prompt.
6456
@@ -74,13 +66,16 @@ def prompt(self, prompt: str) -> str:
7466
)
7567

7668
context = self.rag_helper.retrieve(prompt, top_k=5)
77-
return self._chain().invoke({
69+
chain = self.base_prompt_template | self.chat_llm
70+
response = await chain.ainvoke({
7871
'context': context,
7972
'task':task,
8073
'input':prompt
81-
}).content
74+
})
75+
76+
return response.content
8277

83-
def summarize(self):
78+
async def summarize(self):
8479
"""
8580
Summarize the given document using the LLM.
8681
@@ -107,13 +102,13 @@ def summarize(self):
107102
)
108103

109104
chain = load_summarize_chain(
110-
self.llm,
105+
self.generation_llm,
111106
chain_type="map_reduce",
112107
map_prompt=map_prompt,
113108
combine_prompt=combine_prompt
114109
)
115110

116-
result = chain.invoke({"input_documents": self.rag_helper.summary_chunks})
111+
result = await chain.ainvoke({"input_documents": self.rag_helper.summary_chunks})
117112

118113
return result["output_text"]
119114

@@ -124,7 +119,7 @@ async def generate_flashcards(self):
124119
Returns:
125120
list: A list of flashcard objects.
126121
"""
127-
flashcard_chain = FlashcardChain(self.llm)
122+
flashcard_chain = FlashcardChain(self.generation_llm)
128123
cards = await flashcard_chain.invoke(self.rag_helper.summary_chunks)
129124
return cards
130125

@@ -135,7 +130,7 @@ async def generate_quiz(self):
135130
Returns:
136131
list: A quiz object.
137132
"""
138-
quiz_chain = QuizChain(self.llm)
133+
quiz_chain = QuizChain(self.generation_llm)
139134
quiz = await quiz_chain.invoke(self.rag_helper.summary_chunks)
140135
return quiz
141136

genAi/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ async def receive_prompt(data: PromptRequest):
8585
return {"response": f"ERROR: {error_msg}"}
8686

8787
logger.info(f"Processing chat request for session {data.session_id}")
88-
response = llm_instances[data.session_id].prompt(data.message)
88+
response = await llm_instances[data.session_id].prompt(data.message)
8989
return {"response": response}
9090
except Exception as e:
9191
error_msg = f"Chat error for session {data.session_id}: {str(e)}"
@@ -104,7 +104,7 @@ async def generate_summary(data: SummaryRequest):
104104
return {"response": f"ERROR: {error_msg}"}
105105

106106
logger.info(f"Generating summary for session {data.session_id}")
107-
response = llm_instances[data.session_id].summarize()
107+
response = await llm_instances[data.session_id].summarize()
108108
logger.info(f"Summary generated successfully for session {data.session_id}")
109109
return {"response": response}
110110
except Exception as e:

0 commit comments

Comments
 (0)