/
Stils
/
SQLTranslator
Обзор
Документация
Войти
/
Stils
/
SQLTranslator
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
backend.py
133 строки
6 KB
stilsman
pass
25 май 2025, 23:05
25 май 2025, 23:05
858f345
Код
Авторство
О чём код?
from fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel from langchain.schema import SystemMessage from langchain_community.chat_models.gigachat import GigaChat from langchain.chains import create_retrieval_chain from langchain_core.prompts import ChatPromptTemplate from langchain_community.vectorstores import FAISS from langchain_community.embeddings import GigaChatEmbeddings from langchain.chains.combine_documents import create_stuff_documents_chain import uvicorn import json from langchain.docstore.document import Document import os from dotenv import load_dotenv load_dotenv() credentials = os.getenv("credentials") with open("newrag.json", "r", encoding="utf-8") as file: json_data = json.load(file) documents = [] for item in json_data: metadata = { "id": item["id"], "title": item["title"], "page": item["page"], "keywords": item["keywords"] } doc = Document( page_content=item["text"], metadata=metadata ) documents.append(doc) embedding = GigaChatEmbeddings( credentials=credentials, verify_ssl_certs=False, scope="GIGACHAT_API_PERS" ) vector_store = FAISS.from_documents( documents, embedding ) embedding_retriever = vector_store.as_retriever( search_kwargs={ "k": 3, # Количество возвращаемых документов "score_threshold": 0.7 # Порог релевантности } ) def create_chat_model(selected_model: str) -> GigaChat: return GigaChat( credentials=credentials, verify_ssl_certs=False, scope="GIGACHAT_API_PERS", streaming=True, #temperature=0.78, model=selected_model ) prompt_context=""" Ты — эксперт по базам данных, специализирующийся на глубокой технической адаптации SQL-запросов между различными СУБД. Твоя задача — точно и корректно преобразовывать запросы с диалекта Transact-SQL (Microsoft SQL Server) на PostgreSQL версии 9.4, учитывая специфику каждого диалекта и сохраняя всю функциональность оригинального запроса. Используй предоставленный контекст ({context}) как справочный материал. Учитывай ограничения PostgreSQL 9.4! Сохраняй точную логику и структуру запроса — никаких упрощений, добавлений, сокращений. Не модифицируй то, что не требует преобразования. Если поведение может отличаться от Transact-SQL — поясни, как это отразится в PostgreSQL. Все специфические операторы и конструкции, характерные для Transact-SQL, заменяй на аналогичные решения в PostgreSQL версии 9.4. Запрос должен сохранять свою первоначальную логику и функциональность. Не вноси ненужных изменений в участки кода, которые не нуждаются в адаптации. Проверь совместимость с PostgreSQL в версии 9.4: Код должен полностью соответствовать спецификациям PostgreSQL версии 9.4 и успешно выполняться в этой СУБД. Сообщи обо всех известных тебе ограничениях или особенностях, которые могут повлиять на работоспособность полученного запроса. Детальное пояснение работы запроса: После вывода преобразованного запроса дай подробное описание логики работы твоего итогового запроса. Объясни изменения, которые были сделаны. Структура отправки: Не дели код на фрагменты. Присылай один цельный SQL-блок с пояснениями вне блока. Запрещено использовать конструкцию SQL для комментариев к промежуточным этапам кода. Формат вывода: Сначала: краткое текстовое описание запроса и необходимых преобразований. Затем: полный преобразованный SQL-код в блоке sql. Исходный запрос, который нужно преобразовать:{input} """ prompt = ChatPromptTemplate.from_template(prompt_context) app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) messages = [ SystemMessage( content=prompt_context) ] class Message(BaseModel): text: str model: str = "GigaChat" def send_message(user_input: str, selected_model: str) -> str: document_chain = create_stuff_documents_chain( llm=create_chat_model(selected_model), prompt=prompt ) retrieval_chain = create_retrieval_chain(embedding_retriever, document_chain) response = retrieval_chain.invoke({"input": user_input}) return response["answer"] @app.post("/message/") async def handle_message(message: Message): try: response_text = send_message(message.text, message.model) return {"response": response_text} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000)