Skip to content

Commit

Permalink
Add chatgpt-4o-mini support. Remove chatgpt-3.5-turbo
Browse files Browse the repository at this point in the history
  • Loading branch information
ShkalikovOleh committed Aug 12, 2024
1 parent 9e0d8df commit 22360c8
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 67 deletions.
2 changes: 0 additions & 2 deletions configs/llm/chatgpt-3.5-turbo-instruct.yaml

This file was deleted.

5 changes: 5 additions & 0 deletions configs/llm/chatgpt-4o-mini.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
_target_: langchain_openai.ChatOpenAI
model_name: gpt-4o-mini
temperature: 0
max_tokens: 600
request_timeout: 120
63 changes: 0 additions & 63 deletions configs/prompts/chatgpt-3.5-turbo-instruct.yaml

This file was deleted.

68 changes: 68 additions & 0 deletions configs/prompts/chatgpt-4o-mini.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
rag_prompt:
_target_: langchain_core.prompts.ChatPromptTemplate.from_messages
messages:
- _target_: langchain_core.messages.SystemMessage
content: >
Ви - асистент у завданнях з відповідями на запитання. Використовуйте наведений нижче контекст, щоб відповісти на запитання, що стосуються першокурсників.
Якщо ви не знаєте відповіді, або контекст не релевантний, то просто скажіть, що не знаєте. Відповідайте стисло і використовуйте наданий контекст без додадткових вигадок.
Відповідай виключно українською.
- _target_: langchain_core.prompts.HumanMessagePromptTemplate.from_template
template: >
Запитання: {question}
Контекст: {context}
grading_prompt:
_target_: langchain_core.prompts.ChatPromptTemplate.from_messages
messages:
- _target_: langchain_core.messages.SystemMessage
content: >
Ви - система, яка оцінює відповідність питання до наданих фактів.
Ви оцінюєте відповідність факту до питання:
Оцінка 1 означає, що БУДЬ-ЯКЕ з тверджень у ФАКТІ релевантне до ЗАПИТАННЯ.
Оцінка 0 означає, що ЖОДНЕ з тверджень у ФАКТІ не має відношення до ЗАПИТАННЯ.
1 - найвищий (найкращий) бал. 0 - найнижчий бал, який Ви можете поставити.
Факт не повинен повністю відповідати на питання, простого визначення достатньо.
Факт може просто бути синонімом чи стверджувати, що об'єкт з питання є чимось.
Але ставте оцінку 1 ТОДІ І ТІЛЬКИ ТОДІ, коли факт стосується запитання.
Переконайтеся, що ваші міркування та висновки є правильними.
Уникайте простого зазначення правильної відповіді на початку.
Дайте бінарну оцінку, щоб вказати, чи відповідає документ запитанню.
Надайте бінарну оцінку у форматі JSON з єдиним ключовим словом "score" без оцінки чи пояснень.
- _target_: langchain_core.prompts.HumanMessagePromptTemplate.from_template
template: >
ЗАПИТАННЯ: {question}
ФАКТ: {document}
rewriting_prompt:
_target_: langchain_core.prompts.ChatPromptTemplate.from_messages
messages:
- _target_: langchain_core.messages.SystemMessage
content: >
Перепишіть дане питання для системи пошуку, щоб максимізувати шанс надати точну відповідь на поставлене запитання.
Відповідай стисло, кількість речень не повинна набагато перевищувати кількість речень у оригінальному питанні.
Додай у згенероване питання ключові слова з оригінального питання. Відповідай ВИКЛЮЧНО українською мовою.
Деякі синоніми через тире згруповані за темами, які можуть бути (але не обов'язково) у нагоді:
Спеціальність Прикладна математика: прикладна математика - 113 (код спеціальності) - примат (людина) - ми - ви - у нас
Освітня програма "Математичні методи криптографічного захисту інформації": ММЗІ (кафедра) - крипта (скорочено від криптологія) - ФІ-x3 (назва групи) - криптологи (люди)
Освітня програма "Математичні методи моделювання, розпізнавання образів та комп’ютерного зору": ММАД (кафедра) - матмод - РОКЗ - ФІ-x1 (назва групи)
Спеціальність Кібербезпека: 125 (код спеціальності) - кіббези (люди) - ФБ - ФЕ - ФБшники (люди)
Фізіко-технічний інститут: ФТІ - фізтех - НН ФТІ
Додаткова сессія: допка - додаткова сессія - коміссія - не склав - завалив предмет - єшка
Стипендія: стипуха - підвишка - підвищенна стипендія - стипендія за успіхи у навчанні
Обов'язково використай ці синоніми, якщо у питанні є якесь з пов'язаних слів й ігноруй, якщо нема.
Питання не повинно змінювати суть, змінюй ЛИШЕ форму питання не додавай нічого нового. Не відповідай самостійно на запитання.
- _target_: langchain_core.prompts.HumanMessagePromptTemplate.from_template
template: >
Запитання: {question}
27 changes: 25 additions & 2 deletions crag/pipelines/rag_with_docs_filtering.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,21 @@
from langchain_core.language_models import BaseLanguageModel
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
from langgraph.graph import END, START, StateGraph

from crag.pipelines.base import SimpleRagGraphState, giveup
from crag.pipelines.simple_rag import SimpleRAG
from crag.retrievers.base import PipelineRetrieverBase


class DocumentGradingResult(BaseModel):
score: int = Field(
description="Whether given document is relevant to a question or not"
)


class RAGWithDocsFiltering(SimpleRAG):

def __init__(
Expand All @@ -18,7 +26,14 @@ def __init__(
gradining_prompt: PromptTemplate,
) -> None:
super().__init__(retriever, llm, rag_prompt)
self._grade_chain = gradining_prompt | llm | JsonOutputParser()

if isinstance(llm, ChatOpenAI):
structured_llm = llm.with_structured_output(
DocumentGradingResult, method="json_mode"
)
self._grade_chain = gradining_prompt | structured_llm
else:
self._grade_chain = gradining_prompt | llm | JsonOutputParser()

async def grade_documents(self, state: SimpleRagGraphState) -> SimpleRagGraphState:
question = state["question"]
Expand All @@ -29,7 +44,15 @@ async def grade_documents(self, state: SimpleRagGraphState) -> SimpleRagGraphSta
result = await self._grade_chain.ainvoke(
{"document": doc.page_content, "question": question}
)
if (isinstance(result, dict) and result["score"]) or result == 1:

# consider ill formed output as a bad score
if not isinstance(result, DocumentGradingResult):
if not isinstance(result, dict) or "score" not in result:
continue
else:
result = DocumentGradingResult(score=result["score"])

if result.score:
relevant_docs.append(doc)

state["documents"] = relevant_docs
Expand Down

0 comments on commit 22360c8

Please sign in to comment.