Compare commits

...

3 Commits

Author SHA1 Message Date
0975a65347 correct conflicts 2025-11-10 14:43:41 +00:00
300d9a9ecf add oss 2025-11-10 14:29:45 +00:00
d379b23fef h100 codes create git 2025-11-10 14:27:55 +00:00
7 changed files with 2737 additions and 24 deletions

View File

@ -22,6 +22,7 @@ from langchain_openai import ChatOpenAI # pip install -U langchain_openai
import requests import requests
# from FlagEmbedding import FlagReranker # deldar-reranker-v2 # from FlagEmbedding import FlagReranker # deldar-reranker-v2
import aiofiles import aiofiles
import oss
# chatbot = FastAPI() # chatbot = FastAPI()
# origins = ["*"] # origins = ["*"]
@ -148,6 +149,76 @@ def llm_base_request2(system_prompt, user_prompt):
return answer, cost return answer, cost
async def oss_base_request(sys_prompt, user_prompt):
base_messages = []
try:
if sys_prompt:
base_messages.append({
"role": "system",
"content": sys_prompt
})
base_messages.append({
"role": "user",
"content": user_prompt
})
response = await oss.process_item(base_messages, reasoning_effort='low', temperature=0.1, max_tokens=40)
if response[0]:
answer = response[1]
else:
answer = ''
cost = 0
except Exception as error:
# برای مدیریت خطاها، می‌توانید فایل‌نویسی را به صورت async انجام دهید (در صورت نیاز)
async with aiofiles.open('./llm-answer/error-in-llm.txt', mode='a+', encoding='utf-8') as file:
error_message = f'\n\nquery: {user_prompt.strip()}\nerror:{error} \n------------------------------\n'
await file.write(error_message) # فایل‌نویسی async
return '', 0
return answer, cost
async def oss_request(query):
if query == '':
return 'لطفا متن سوال را وارد نمائید', 0
try:
messages.append({"role": "user", "content": query})
print(f'final prompt request attmpt')
response = await oss.process_item(messages= messages) # reasoning_effort='high'
print(response)
if response[0]:
answer = response[1]
else:
answer = 'متاسفانه پاسخی دریافت نشد'
cost_prompt = 0
# پاسخ را هم به سابقه اضافه می‌کنیم
messages.append({"role": "assistant", "content": answer})
response_dict = {}
response_dict['output'] = str(response)
async with aiofiles. open('./llm-answer/messages.json', mode='w', encoding='utf-8') as output:
await output.write(json.dumps(response_dict, ensure_ascii=False, indent=2))
print('response created')
async with aiofiles.open('./llm-answer/chat-objs.txt', mode='a+', encoding='utf-8') as file:
response_value = '0'
await file.write(response_value) # estimated_cost
except Exception as error:
print(f'error-in-llm.txt writing ...')
async with aiofiles.open('./llm-answer/error-in-llm.txt', mode='a+', encoding='utf-8') as file:
error_message = f'\n\nquery: {query.strip()}\nerror:{error} \n-------------------------------\n'
await file.write(error_message)
return 'با عرض پوزش؛ متاسفانه خطایی رخ داده است. لطفا لحظاتی دیگر دوباره تلاش نمائید', 0
print('================')
print(f'len messages: {len(messages)}')
print('================')
return answer, cost_prompt
async def llm_request(query, model): async def llm_request(query, model):
if query == '': if query == '':
@ -489,7 +560,7 @@ async def get_title_user_prompt(query: str):
""" """
get a query and prepare a prompt to generate title based on that get a query and prepare a prompt to generate title based on that
""" """
title_prompt = f'برای متن {query} زیر، یک موضوع با معنا که بین 3 تا 6 کلمه داشته باشد، در قالب یک رشته متن ایجاد کن. سبک ادبی عنوان، حقوقی و کاملا رسمی باشد. عنوان تولید شده کاملا ساده و بدون هیچ مارک داون یا علائم افزوده ای باشد. غیر از عنوان، به هیچ وجه توضیح اضافه ای در قبل یا بعد آن اضافه نکن.' title_prompt = f'برای متن {query} یک عنوان با معنا که بین 3 تا 6 کلمه داشته باشد، در قالب یک رشته متن ایجاد کن. سبک و لحن عنوان، حقوقی و کاملا رسمی باشد. عنوان تولید شده کاملا ساده و بدون هیچ مارک داون یا علائم افزوده ای باشد. غیر از عنوان، به هیچ وجه توضیح اضافه ای در قبل یا بعد آن اضافه نکن.'
return title_prompt return title_prompt
async def get_title_system_prompt(): async def get_title_system_prompt():
@ -517,7 +588,11 @@ async def run_chatbot(query:str, chat_id:str):
before_title_time = datetime.datetime.now() before_title_time = datetime.datetime.now()
title_system_prompt = await get_title_system_prompt() title_system_prompt = await get_title_system_prompt()
title_user_prompt = await get_title_user_prompt(query) title_user_prompt = await get_title_user_prompt(query)
title, cost_title = await llm_base_request(title_system_prompt, title_user_prompt) # title, cost_title = await llm_base_request(title_system_prompt, title_user_prompt)
title, cost_title = await oss_base_request(title_system_prompt, title_user_prompt)
if not title:
title = query
title_prompt_duration = (datetime.datetime.now() - before_title_time).total_seconds() title_prompt_duration = (datetime.datetime.now() - before_title_time).total_seconds()
if title == '': if title == '':
@ -533,18 +608,18 @@ async def run_chatbot(query:str, chat_id:str):
prompt = f'برای پرسش "{query}" از میان مواد قانونی "{result_passages_text}" .پاسخ مناسب و دقیق را استخراج کن. درصورتی که مطلبی مرتبط با پرسش در متن پیدا نشد، فقط پاسخ بده: "متاسفانه در منابع، پاسخی پیدا نشد!"' prompt = f'برای پرسش "{query}" از میان مواد قانونی "{result_passages_text}" .پاسخ مناسب و دقیق را استخراج کن. درصورتی که مطلبی مرتبط با پرسش در متن پیدا نشد، فقط پاسخ بده: "متاسفانه در منابع، پاسخی پیدا نشد!"'
for model in models: # for model in models:
# before_prompt_credit = credit_refresh() # before_prompt_credit = credit_refresh()
try: try:
llm_model = model # llm_model = model
print(f'using model: {llm_model}') # print(f'using model: {llm_model}')
llm_answer, cost_prompt = await llm_request(prompt, model) # llm_answer, cost_prompt = await llm_request(prompt, model)
llm_answer, cost_prompt = await oss_request(prompt)
break
except Exception as error: except Exception as error:
# after_prompt_credit = credit_refresh() # after_prompt_credit = credit_refresh()
# prompt_cost = int(before_prompt_credit) - int(after_prompt_credit) # prompt_cost = int(before_prompt_credit) - int(after_prompt_credit)
error = f'model: {model} \n{error}\n\n' error = f'model: gpt.oss.120b \n{error}\n\n'
print('+++++++++++++++++') print('+++++++++++++++++')
print(f'llm-error.txt writing error: {error}') print(f'llm-error.txt writing error: {error}')
print('+++++++++++++++++') print('+++++++++++++++++')

View File

@ -2,3 +2,4 @@ FROM docker.tavasi.ir/tavasi/qachat_base:1.0.0
RUN pip install uvicorn[standard] RUN pip install uvicorn[standard]
RUN pip install FlagEmbedding RUN pip install FlagEmbedding
RUN pip install aiofiles RUN pip install aiofiles
RUN pip install openai

File diff suppressed because one or more lines are too long

View File

@ -539,3 +539,40 @@ Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessa
31.68 31.68
------------------------------- -------------------------------
45.93
-------------------------------
74.96
-------------------------------
100.02
-------------------------------
129.08
-------------------------------
123.44
-------------------------------
236.05
-------------------------------
259.93
-------------------------------
291.77
-------------------------------
319.9
-------------------------------
348.04
-------------------------------
383.19
-------------------------------
235.45
-------------------------------
0000000000000000000000000000

View File

@ -372,3 +372,46 @@
44238.73 44238.73
44238.73 44238.73
44238.73 44238.73
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
44201.47
43951.09
42258.63
42258.63
42258.63
42258.63
42258.63
42258.63
42258.63

File diff suppressed because one or more lines are too long

63
oss.py Normal file
View File

@ -0,0 +1,63 @@
from openai import AsyncOpenAI
LLM_URL = "http://172.16.29.102:8001/v1/"
# item structure:
# item = {
# 'id' : '',
# 'system_prompt' : '',
# 'user_prompt' : '',
# 'assistant_prompt' : '',
# }
async def process_item(messages, reasoning_effort= 'medium', temperature= 0.4, top_p= 0.9, max_tokens= 2048):
"""
generates answer with gpt-oss-120b model
**Args:
reasoning_effort = 'medium' # -> low / high / medium
temperature = 0.4 # 0-1 -> creativity
top_p = 0.9 # 0-1 -> logic
max_tokens = 2048 # -> ... 128K
** Returns(tuple):
returns True, generated answer / False, failed message
"""
try:
async with AsyncOpenAI(base_url= LLM_URL, api_key="EMPTY") as client:
model_name = 'gpt-oss-120b'
# messages = [
# {"role": "system", "content": prompt_params.get("system_prompt", "")},
# {"role": "user", "content": prompt_params.get("user_prompt", "")},
# ]
# if prompt_params.get("assistant_prompt"):
# messages.append(
# {"role": "assistant", "content": prompt_params["assistant_prompt"]}
# )
# print(f'==== max_token {max_token}')
response = await client.chat.completions.parse(
model= model_name,
messages= messages,
temperature= temperature, # 0-1
top_p=top_p, # 0-1
reasoning_effort= reasoning_effort, # low , high , medium
# max_tokens= max_tokens, # ... 128K
stop= None,
)
# print('666666666666666666666666666666666')
# print(f"response.choices[0].message.parsed: {response.choices[0].message.parsed}")
# print('666666666666666666666666666666666')
if response and response.choices : # and response.choices[0].message.parsed:
response_message = response.choices[0].message.content
return True, response_message
except Exception as e:
response_message = 'error in llm response generation!'
print('!!!!!!!!!!!!!!!!!!!!!!!!!')
print(e)
print('!!!!!!!!!!!!!!!!!!!!!!!!!')
return False, response_message