File size: 2,271 Bytes
a247852 5f93064 a247852 2c18e37 a247852 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
from fastapi import FastAPI
from pydantic import BaseModel
from huggingface_hub import hf_hub_download
from llama_cpp import Llama
# Definição do modelo de dados de entrada
class Question(BaseModel):
text: str
# Inicializando o FastAPI
app = FastAPI()
# Download e configuração do modelo
model_name_or_path = "souzat19/Llama3.1_fn14133.29122024"
model_basename = "unsloth.Q4_K_M.gguf"
model_path = hf_hub_download(repo_id=model_name_or_path, filename=model_basename)
print(f"Model path: {model_path}")
# Configuração do modelo com llama_cpp
lcpp_llm = Llama(
model_path=model_path,
n_threads=2,
n_batch=512,
n_gpu_layers=-1,
n_ctx=4096,
)
# Formato de prompt utilizado no fine-tuning
alpaca_prompt = """Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.
### Instruction:
{}
### Input:
{}
### Response:
{}"""
def get_response(text: str) -> str:
# Formatar o prompt usando o mesmo template utilizado no fine-tuning
formatted_prompt = alpaca_prompt.format(
"Você é um assistente especializado em planejamento de compras públicas de acordo com a Lei 14.133/2021 e regulamentos infralegais. Responda de forma clara, detalhada e didática e utilize exemplos práticos para explicar os conceitos.",
text,
""
)
response = lcpp_llm(
prompt=formatted_prompt,
max_tokens=2096,
temperature=0.5,
top_p=0.95,
top_k=50,
stop=['### Response:'], # Usar "### Response:" como token de parada
echo=True
)
response_text = response['choices'][0]['text']
# Extrair a resposta após "### Response:"
if "### Response:" in response_text:
answer = response_text.split("### Response:")[1].strip()
else:
answer = response_text.strip()
print(f"Final Answer: {answer}")
return answer
# Endpoint para receber uma questão e retornar a resposta
@app.post("/ask")
def ask_question(question: Question):
response = get_response(question.text)
return {"response": response}
@app.get("/")
async def root():
return {"status": "online", "message": "API is running. Use POST /ask to make queries."}
|