g1-demo / g__1.py
enotkrutoy's picture
Rename g1.py to g__1.py
34845da verified
import groq
import time
import os
import json
client = groq.Groq()
def make_api_call(messages, max_tokens, is_final_answer=False, custom_client=None):
global client
if custom_client != None:
client = custom_client
for attempt in range(3):
try:
if is_final_answer:
response = client.chat.completions.create(
model="llama3-8b-8192",
messages=messages,
max_tokens=max_tokens,
temperature=0.2,
)
return response.choices[0].message.content
else:
response = client.chat.completions.create(
model="llama3-8b-8192",
messages=messages,
max_tokens=max_tokens,
temperature=0.2,
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
except Exception as e:
if attempt == 2:
if is_final_answer:
return {"title": "Error", "content": f"Failed to generate final answer after 3 attempts. Error: {str(e)}"}
else:
return {"title": "Error", "content": f"Failed to generate step after 3 attempts. Error: {str(e)}", "next_action": "final_answer"}
time.sleep(1) # Wait for 1 second before retrying
def generate_response(prompt, custom_client=None):
messages = [
{"role": "system", "content": """
Вы – экспертный помощник по искусственному интеллекту, который подробно объясняет свои рассуждения шаг за шагом.
**Формат ответа**: JSON с ключами **"title"**, **"content"** и **"next_action"** (значения: "continue" или "final_answer").
**Минимальное количество шагов рассуждений**: 3.
### Основные принципы рассуждения:
1. **Пошаговый анализ**
- Каждому шагу присваивается заголовок, отражающий его содержание.
- Для каждого шага необходимо определить, нужен ли следующий шаг или можно дать окончательный ответ.
2. **Оценка своих ограничений**
- Учитывайте, что вы – языковая модель (LLM), и осознавайте свои сильные и слабые стороны.
3. **Исследование альтернативных решений**
- Рассмотрите несколько возможных ответов и исследуйте их обоснованность.
- Всегда проверяйте, где в ваших рассуждениях могут быть ошибки.
4. **Методы рассуждений** (используйте минимум 3 подхода):
- Анализ вопроса: Определите ключевые элементы запроса.
- Разбиение на под-вопросы: Разделите задачу на более простые части.
- Переосмысление: Формулируйте вопрос по-другому для лучшего понимания.
- Контекстуальный анализ: Определите, какая информация необходима для ответа.
- Проверка предположений: Какие гипотезы заложены в вопросе?
- Связывание концепций: Определите взаимосвязь между различными понятиями.
5. **Оценка промежуточных мыслей**
- **Ясность**: Насколько понятно сформулирована мысль?
- **Релевантность**: Насколько она соответствует под-вопросу?
- **Логическая последовательность**: Вписывается ли она в ход рассуждений?
- **Охват концепций**: Насколько полно она охватывает нужную информацию?
6. **Оптимизация цепочки рассуждений**
- Отбирайте самые логичные и релевантные мысли.
- Постройте последовательную цепочку, соединяя наиболее сильные идеи.
- При необходимости пересматривайте решения и ищите альтернативные пути.
### Пример JSON-ответа:
```json
{
"title": "Выделение ключевой информации",
"content": "На первом этапе необходимо внимательно изучить входные данные и определить основные элементы задачи. Это поможет структурировать дальнейший анализ...",
"next_action": "continue"
}
```
"""},
{"role": "user", "content": prompt},
{"role": "assistant", "content": "Спасибо! Теперь я буду думать шаг за шагом после моих инструкций, начиная с начала после разложения проблемы."}
]
steps = []
step_count = 1
total_thinking_time = 0
while True:
start_time = time.time()
step_data = make_api_call(messages, 300, custom_client=custom_client)
end_time = time.time()
thinking_time = end_time - start_time
total_thinking_time += thinking_time
steps.append((f"Step {step_count}: {step_data['title']}", step_data['content'], thinking_time))
messages.append({"role": "assistant", "content": json.dumps(step_data)})
if step_data['next_action'] == 'final_answer' or step_count > 25: # Maximum of 25 steps to prevent infinite thinking time. Can be adjusted.
break
step_count += 1
# Yield after each step for Streamlit to update
yield steps, None # We're not yielding the total time until the end
# Generate final answer
messages.append({"role": "user", "content": "Пожалуйста, предоставьте окончательный ответ, основанный исключительно на ваших рассуждениях выше. Не используйте форматирование JSON. Предоставьте текстовый ответ только без каких -либо названий или преамблей. Сохранить любое форматирование, как указано в исходной подсказке, например, точное форматирование для бесплатного ответа или множественный выбор."})
start_time = time.time()
final_data = make_api_call(messages, 1200, is_final_answer=True, custom_client=custom_client)
end_time = time.time()
thinking_time = end_time - start_time
total_thinking_time += thinking_time
steps.append(("Final Answer", final_data, thinking_time))
yield steps, total_thinking_time