Spaces:
Runtime error
Runtime error
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 | |