LevinAleksey commited on
Commit
adfda88
·
verified ·
1 Parent(s): 73b5dd2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +58 -29
app.py CHANGED
@@ -4,42 +4,54 @@ from huggingface_hub import InferenceClient
4
  from qdrant_client import QdrantClient
5
  from sentence_transformers import SentenceTransformer
6
 
7
- # --- НАСТРОЙКИ ---
8
  HF_TOKEN = os.getenv("HF_TOKEN")
9
  QDRANT_URL = os.getenv("QDRANT_URL")
10
  QDRANT_API_KEY = os.getenv("QDRANT_API_KEY")
11
  MODEL_ID = "Qwen/Qwen2.5-7B-Instruct"
12
 
13
- # --- ИНИЦИАЛИЗАЦИЯ ПРИ СТАРТЕ ЧАТА ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  @cl.on_chat_start
15
  async def start():
16
- # 1. Показываем загрузку
17
- msg = cl.Message(content="Загружаю базы знаний и подключаюсь к нейросетям...")
18
- await msg.send()
19
 
20
- # 2. Инициализируем клиентов (сохраняем в сессию пользователя)
21
  hf_client = InferenceClient(MODEL_ID, token=HF_TOKEN)
22
 
23
  q_client = None
24
  if QDRANT_URL and QDRANT_API_KEY:
25
  try:
26
  q_client = QdrantClient(url=QDRANT_URL, api_key=QDRANT_API_KEY)
27
- print("✅ Qdrant OK")
28
  except:
29
  print("❌ Qdrant Error")
30
 
31
  encoder = SentenceTransformer('all-MiniLM-L6-v2')
32
 
33
- # Сохраняем в сессию, чтобы использовать при каждом сообщении
34
  cl.user_session.set("hf_client", hf_client)
35
  cl.user_session.set("q_client", q_client)
36
  cl.user_session.set("encoder", encoder)
 
 
 
 
37
 
38
- # 3. Обновляем сообщение на приветствие
39
- msg.content = "👋 Привет! Я готов к работе. Задай вопрос по базе знаний."
40
- await msg.update()
41
-
42
- # --- ФУНКЦИЯ RAG (ПОИСК) ---
43
  def get_context(query, q_client, encoder):
44
  if not q_client: return ""
45
  try:
@@ -55,39 +67,56 @@ def get_context(query, q_client, encoder):
55
  # --- ОБРАБОТКА СООБЩЕНИЯ ---
56
  @cl.on_message
57
  async def main(message: cl.Message):
58
- # Достаем инструменты из сессии
59
  hf_client = cl.user_session.get("hf_client")
60
  q_client = cl.user_session.get("q_client")
61
  encoder = cl.user_session.get("encoder")
 
62
 
63
- # 1. Ищем контекст в RAG
64
  context = get_context(message.content, q_client, encoder)
65
 
66
- # 2. Формируем промпт
67
- system_prompt = "Ты полезный ассистент. Отвечай на русском языке."
68
  if context:
69
- system_prompt += f"\n\nИспользуй эту информацию для ответа:\n{context}"
70
- # Можно показать найденный контекст в UI (опционально)
71
- # await cl.Message(content=f"📚 Наше�� в базе:\n{context[:100]}...").send()
72
 
73
- messages = [
74
- {"role": "system", "content": system_prompt},
75
- {"role": "user", "content": message.content}
76
- ]
 
 
 
 
 
 
 
77
 
78
- # 3. Отправляем в Qwen и стримим ответ
79
  msg = cl.Message(content="")
80
- await msg.send() # Создаем пустой пузрь
81
 
 
82
  try:
83
- stream = hf_client.chat_completion(messages, max_tokens=1024, stream=True, temperature=0.7)
 
 
 
 
 
84
 
85
  for chunk in stream:
86
  token = chunk.choices[0].delta.content
87
  if token:
 
88
  await msg.stream_token(token)
89
-
90
- await msg.update() # Финализируем сообщение
 
 
 
 
 
91
 
92
  except Exception as e:
93
  await cl.Message(content=f"Ошибка: {str(e)}").send()
 
4
  from qdrant_client import QdrantClient
5
  from sentence_transformers import SentenceTransformer
6
 
7
+ # --- КОНФИГУРАЦИЯ ---
8
  HF_TOKEN = os.getenv("HF_TOKEN")
9
  QDRANT_URL = os.getenv("QDRANT_URL")
10
  QDRANT_API_KEY = os.getenv("QDRANT_API_KEY")
11
  MODEL_ID = "Qwen/Qwen2.5-7B-Instruct"
12
 
13
+ # --- МОЩНЫЙ ПРОМПТ ПРОДАЖНИКА ---
14
+ SALES_SYSTEM_PROMPT = """
15
+ Ты — ведущий эксперт по внедрению ИИ и автоматизации (n8n, RAG, Chatbots).
16
+ Твоя задача: Квалифицировать клиента и продать услуги агентства.
17
+
18
+ ТВОИ ПРАВИЛА:
19
+ 1. Тон: Уверенный, деловой, экспертный. Не будь "роботом-слугой". Ты — партнер по бизнесу.
20
+ 2. Цель: Не просто ответить на вопрос, а вывести клиента на следующий шаг (звонок, аудит, КП).
21
+ 3. Если спрашивают цену: Не называй цифру "в лоб" без контекста. Сначала спроси детали задачи, объясни ценность, потом дай вилку "от...".
22
+ 4. Работа с возражениями: Если говорят "дорого", объясни, сколько денег они теряют без автоматизации.
23
+ 5. Краткость: Пиши емко. Максимум 3-4 предложения за раз.
24
+ 6. В конце ответа ВСЕГДА задавай вовлекающий вопрос.
25
+ """
26
+
27
+ # --- СТАРТ СЕССИИ ---
28
  @cl.on_chat_start
29
  async def start():
30
+ # 1. Приветствие
31
+ await cl.Message(content="👋 Привет! Я AI-архитектор. Готов обсудить автоматизацию твоего бизнеса. Какую задачу решаем?").send()
 
32
 
33
+ # 2. Инициализация (сохраняем в сессию, чтобы не грузить каждый раз)
34
  hf_client = InferenceClient(MODEL_ID, token=HF_TOKEN)
35
 
36
  q_client = None
37
  if QDRANT_URL and QDRANT_API_KEY:
38
  try:
39
  q_client = QdrantClient(url=QDRANT_URL, api_key=QDRANT_API_KEY)
40
+ print("✅ Qdrant Connected")
41
  except:
42
  print("❌ Qdrant Error")
43
 
44
  encoder = SentenceTransformer('all-MiniLM-L6-v2')
45
 
 
46
  cl.user_session.set("hf_client", hf_client)
47
  cl.user_session.set("q_client", q_client)
48
  cl.user_session.set("encoder", encoder)
49
+
50
+ # 3. СОЗДАЕМ ИСТОРИЮ СООБЩЕНИЙ (ПАМЯТЬ)
51
+ # Сразу кладем туда системный промпт, но без RAG-контекста (он добавится динамически)
52
+ cl.user_session.set("message_history", [])
53
 
54
+ # --- ПОИСК В БАЗЕ (RAG) ---
 
 
 
 
55
  def get_context(query, q_client, encoder):
56
  if not q_client: return ""
57
  try:
 
67
  # --- ОБРАБОТКА СООБЩЕНИЯ ---
68
  @cl.on_message
69
  async def main(message: cl.Message):
 
70
  hf_client = cl.user_session.get("hf_client")
71
  q_client = cl.user_session.get("q_client")
72
  encoder = cl.user_session.get("encoder")
73
+ history = cl.user_session.get("message_history")
74
 
75
+ # 1. Поиск в базе знаний по ТЕКУЩЕМУ вопросу
76
  context = get_context(message.content, q_client, encoder)
77
 
78
+ # 2. Формируем актуальный системный промпт с найденными знаниями
79
+ current_system_prompt = SALES_SYSTEM_PROMPT
80
  if context:
81
+ current_system_prompt += f"\n\nВАЖНАЯ ИНФОРМАЦИЯ ИЗ БАЗЫ ЗНАНИЙ КОМПАНИИ:\n{context}\nИспользуй это для ответа."
 
 
82
 
83
+ # 3. Собираем массив сообщений для нейросети
84
+ # Сначала идет системный промпт (свежий, с контекстом)
85
+ messages_payload = [{"role": "system", "content": current_system_prompt}]
86
+
87
+ # Потом добавляем историю переписки (последние 10 сообщений, чтобы не перегружать)
88
+ # Это и есть "Память"
89
+ for msg in history[-10:]:
90
+ messages_payload.append(msg)
91
+
92
+ # И в конце - текущий вопрос пользователя
93
+ messages_payload.append({"role": "user", "content": message.content})
94
 
95
+ # 4. Отправляем в Qwen
96
  msg = cl.Message(content="")
97
+ await msg.send()
98
 
99
+ full_response = ""
100
  try:
101
+ stream = hf_client.chat_completion(
102
+ messages=messages_payload,
103
+ max_tokens=1024,
104
+ stream=True,
105
+ temperature=0.7
106
+ )
107
 
108
  for chunk in stream:
109
  token = chunk.choices[0].delta.content
110
  if token:
111
+ full_response += token
112
  await msg.stream_token(token)
113
+
114
+ await msg.update()
115
+
116
+ # 5. ВАЖНО: Обновляем историю (запоминаем этот диалог)
117
+ history.append({"role": "user", "content": message.content})
118
+ history.append({"role": "assistant", "content": full_response})
119
+ cl.user_session.set("message_history", history)
120
 
121
  except Exception as e:
122
  await cl.Message(content=f"Ошибка: {str(e)}").send()