LLM之RAG实战(五十)| FastAPI:构建基于LLM的WEB接口界面

       FastAPI是WEB UI接口,随着LLM的蓬勃发展,FastAPI的生态也迎来了新的机遇。本文将围绕FastAPI、OpenAI的API以及FastCRUD,来创建一个个性化的电子邮件写作助手,以展示如何结合这些技术来构建强大的应用程序。

下面我们开始分步骤操作:

一、安装环境

首先,我们创建一个文件夹

mkdir email-assistant-api

进入到该文件夹

cd email-assistant-api

我们使用poetry来管理python包,首先需要先安装poetry

pip install poetry

进入到email-assistant-api文件夹中,并初始化

poetry init

写下所要求的内容(默认为空),然后按 Enter 键

对交互式依赖项键入 no,直到您获得如下内容:

       然后只需按 enter 键确认生成。您应该注意到在您的文件夹中创建了一个 pyproject.toml 文件,这是 poetry 用来管理依赖项的文件。

        让我们从添加依赖项开始

poetry add fastapi fastcrud sqlmodel openai aiosqlite greenlet python-jose bcrypt

      现在你应该还注意到一个 poetry.lock 文件,这是 poetry 保存已安装包的实际版本的方式。

二、项目结构

       对于 FastAPI 应用程序,我们有三个主要内容:模型、架构和端点。由于这个 API 很简单,我们可以像这样创建我们的结构:

email_assistant_api/├── app/│   ├── __init__.py│   ├── main.py        # The main application file│   ├── routes.py      # Contains API route definitions and endpoint logic│   ├── database.py    # Database setup and session management│   ├── models.py      # SQLModel models for the application│   ├── crud.py        # CRUD operation implementations using FastCRUD│   ├── schemas.py     # Schemas for request and response models│   └── .env           # Environment variables├── pyproject.toml     # Project configuration and dependencies├── README.md          # Provides an overview and documentation└── .gitignore         # Files to be ignored by version control
  • models.py 中定义我们的模型(数据库表的抽象);
  • schemas.py用于验证和序列化数据;
  • routes.py定义端点;
  • database.py定义数据库相关信息;
  • crud.py定义与数据库交互的crud操作;
  • .env定义环境变量,比如API Key;
  • main.py定义 FastAPI 应用程序和 API 的入口点;

请注意,此结构适用于小型应用程序,但如果您想为大型应用程序提供更强大的模板,请参考:https://github.com/igorbenav/FastAPI-boilerplate

2.1 对数据库进行建模

对于数据库,我们有一个简单的模型

  • 用户有一个用户名、一个名字、一个电子邮件,我们存储一个哈希密码。
  • 电子邮件日志包含我们为输入定义的内容,以及与此日志关联的用户的时间戳、generated_email 和 ID。
  • 用户可能有多个电子邮件日志。

models.py代码示例:

# app/models.pyfrom sqlmodel import SQLModel, Fieldfrom typing import Optionalclass User(SQLModel, table=True):    id: Optional[int] = Field(default=None, primary_key=True)    name: str = Field(..., min_length=2, max_length=30)    username: str = Field(..., min_length=2, max_length=20)    email: str    hashed_password: strclass EmailLog(SQLModel, table=True):    id: Optional[int] = Field(default=None, primary_key=True)    user_id: int = Field(foreign_key="user.id")    user_input: str    reply_to: Optional[str] = Field(default=None)    context: Optional[str] = Field(default=None)    length: Optional[int] = Field(default=None)    tone: str    generated_email: str    timestamp: str

       为了与我们的数据库交互,我们将在 crud.py 中为每个模型实例化 FastCRUD[1]

# app/crud.pyfrom fastcrud import FastCRUDfrom .models import User, EmailLogcrud_user = FastCRUD(User)crud_email_log = FastCRUD(EmailLog)

2.2 创建schemas

schemas.py 中创建我们的 schemas

# app/schemas.pyfrom datetime import datetimefrom typing import Optionalfrom sqlmodel import SQLModel, Field# ------- user -------class UserCreate(SQLModel):    name: str    username: str    email: str    password: strclass UserRead(SQLModel):    id: int    name: str    username: str    email: strclass UserCreateInternal(SQLModel):    name: str    username: str    email: str    hashed_password: str# ------- email -------class EmailRequest(SQLModel):    user_input: str    reply_to: Optional[str] = None    context: Optional[str] = None    length: int = 120    tone: str = "formal"class EmailResponse(SQLModel):    generated_email: str# ------- email log -------class EmailLogCreate(SQLModel):    user_id: int    user_input: str    reply_to: Optional[str] = None    context: Optional[str] = None    length: Optional[int] = None    tone: Optional[str] = None    generated_email: str    timestamp: datetime = Field(      default_factory=lambda: datetime.now(UTC)    )class EmailLogRead(SQLModel):    user_id: int    user_input: str    reply_to: Optional[str]    context: Optional[str]    length: Optional[int]    tone: Optional[str]    generated_email: str    timestamp: datetime
  • 要创建用户,我们要求提供姓名、用户名、电子邮件和密码(我们将存储哈希值);
  • 我们将默认长度设置为 120,默认tone设置为 “正式”;
  • 我们自动生成 EmailLog 的时间戳

2.3 创建我们的应用程序并设置数据库

       尽管我们已经有了模型和架构,但实际上我们既没有为终端节点提供服务的应用程序,也没有用于创建表的数据库。

下面看一下database.py:

# app/database.pyfrom sqlmodel import SQLModel, create_engine, AsyncSessionfrom sqlalchemy.ext.asyncio import create_async_enginefrom sqlalchemy.orm import sessionmakerDATABASE_URL = "sqlite+aiosqlite:///./emailassistant.db"engine = create_async_engine(DATABASE_URL, echo=True)async_session = sessionmaker(    engine, class_=AsyncSession, expire_on_commit=False)async def create_db_and_tables():    async with engine.begin() as conn:        await conn.run_sync(SQLModel.metadata.create_all)async def get_session() -> AsyncSession:    async with async_session() as session:        yield session

      在这里,我们连接到了一个 SQLite 数据库,创建了一个函数来创建我们的数据库和表,以及一个允许我们与该数据库交互的会话。

现在让我们最终创建我们的 FastAPI 应用程序:

# app/main.pyfrom fastapi import FastAPIfrom .database import create_db_and_tablesasync def lifespan(app):    await create_db_and_tables()    yieldapp = FastAPI(lifespan=lifespan)

我们定义lifespan,以便在启动时创建 db 和 tables。

让我们运行一下代码来测试一下:

poetry run fastapi run

结果如下所示:

在浏览器登录如下地址:

127.0.0.1:8000/docs

可以看到如下界面:

可以在终端中按 Ctrl C 暂时关闭应用程序。

2.4 创建端点

       接下来,创建端点来生成电子邮件。

       首先在 .env 中输入 OpenAI API 密钥(这将被 .gitignore 忽略,并且不会出现在我们的存储库中):

# app/.envOPENAI_API_KEY="my_openai_api_key"

将其写入 .gitignore 以确保不会提交此 API 密钥:

# .gitignore.env.venvenv/venv/ENV/env.bak/venv.bak/

现在从 .env 中获取 OpenAI API 密钥并实例化客户端:

# app/routes.pyimport osfrom starlette.config import Configfrom openai import OpenAIcurrent_file_dir = os.path.dirname(os.path.realpath(__file__))env_path = os.path.join(current_file_dir, ".env")config = Config(env_path)OPENAI_API_KEY = config("OPENAI_API_KEY")open_ai_client = OpenAI(api_key=OPENAI_API_KEY)

为电子邮件终端节点创建一个路由器,并实际为电子邮件创建终端节点:

  • 我们将创建一个系统提示符,使输出适应我们想要的结果;
  • 我们将创建一个基本提示,用于格式化传递的信息;
  • 然后我们将此信息传递给 OpenAI 客户端;
  • 最后,我们将在数据库中创建一个日志条目并返回生成的电子邮件
# app/routes.py...from openai import OpenAIfrom fastapi import APIRouter, Depends, HTTPExceptionfrom .schemas import EmailRequest, EmailResponsefrom .database import get_session...# ------- email -------email_router = APIRouter()@email_router.post("/", response_model=EmailResponse)async def generate_email(    request: EmailRequest,     db: AsyncSession = Depends(get_session)):    try:        system_prompt = f"""        You are a helpful email assistant.         You get a prompt to write an email,        you reply with the email and nothing else.        """                prompt = f"""        Write an email based on the following input:        - User Input: {request.user_input}        - Reply To: {request.reply_to if request.reply_to else 'N/A'}        - Context: {request.context if request.context else 'N/A'}        - Length: {request.length if request.length else 'N/A'} characters        - Tone: {request.tone if request.tone else 'N/A'}        """                response = await open_ai_client.chat.completions.create(            model="gpt-3.5-turbo",            messages=[                {"role": "system", "content": system_prompt},                {"role": "user", "content": prompt},            ],            max_tokens=request.length        )                generated_email = response.choices[0].message['content'].strip()        log_entry = EmailLogCreate(            user_id=request.user_id,            user_input=request.user_input,            reply_to=request.reply_to,            context=request.context,            length=request.length,            tone=request.tone,            generated_email=generated_email,        )        await crud_email_logs.create(db, log_entry)        return EmailResponse(generated_email=generated_email)    except Exception as e:        raise HTTPException(status_code=500, detail=str(e))

      现在定义 app/main.py ,将这个电子邮件路由器包含到我们的 FastAPI 应用程序中:

# app/main.pyfrom fastapi import FastAPIfrom .database import create_db_and_tablesfrom .routes import email_routerasync def lifespan(app):    await create_db_and_tables()    yieldapp = FastAPI(lifespan=lifespan)app.include_router(email_router, prefix="/generate", tags=["Email"])

       再次保存并运行 FastAPI 应用程序 (127.0.0.1:8000/docs),会看到如下界面:

      点击这个新创建的 post 端点,传递一些信息并单击 execute

可以得到如下内容:

       结果是我们所希望的回应,但是目前还无法通过查看日志来判断系统是否正常工作,因此让我们也创建电子邮件日志端点:

# app/routes.py...from fastapi import APIRouter, Depends, HTTPExceptionfrom sqlalchemy.ext.asyncio.session import AsyncSessionfrom .schemas import EmailLogCreate, EmailLogRead...# ------- email log -------log_router = APIRouter()@log_router.get("/")async def read_logs(db: AsyncSession = Depends(get_session)):    logs = await crud_email_logs.get_multi(db)    return logs@log_router.get("/{log_id}", response_model=EmailLogRead)async def read_log(log_id: int, db: AsyncSession = Depends(get_session)):    log = await crud_email_logs.get(db, id=log_id)    if not log:        raise HTTPException(status_code=404, detail="Log not found")    return log

       我们可以按其 ID 查看多个日志或一个日志。让我们也将这个路由器包含在我们的应用程序中:

# app/main.pyfrom fastapi import FastAPIfrom .database import create_db_and_tablesfrom .routes import email_router, log_routerasync def lifespan(app):    await create_db_and_tables()    yieldapp = FastAPI(lifespan=lifespan)app.include_router(email_router, prefix="/generate", tags=["Email"])app.include_router(log_router, prefix="/logs", tags=["Logs"])

三、用户功能、身份验证和安全性

现在,让我们添加实际的用户创建功能。首先在终端上运行:

openssl rand -hex 32

然后将结果写入 .env 作为SECRET_KEY

# app/.envOPENAI_API_KEY="my_openai_api_key"SECRET_KEY="my_secret_key"

首先创建一个文件 helper.py 并将以下代码粘贴到其中:

# app/helper.pyimport osfrom datetime import UTC, datetime, timedeltafrom typing import Any, Annotatedimport bcryptfrom jose import JWTError, jwtfrom fastapi import Depends, HTTPExceptionfrom fastapi.security import OAuth2PasswordBearerfrom sqlalchemy.ext.asyncio import AsyncSessionfrom sqlmodel import SQLModelfrom starlette.config import Configfrom .database import get_sessionfrom .crud import crud_userscurrent_file_dir = os.path.dirname(os.path.realpath(__file__))env_path = os.path.join(current_file_dir, ".env")config = Config(env_path)# Security settingsSECRET_KEY = config("SECRET_KEY")oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/users/login")# Token modelsclass Token(SQLModel):    access_token: str    token_type: strclass TokenData(SQLModel):    username_or_email: str# Utility functionsasync def verify_password(plain_password: str, hashed_password: str) -> bool:    """Verify a plain password against a hashed password."""    return bcrypt.checkpw(plain_password.encode(), hashed_password.encode())def get_password_hash(password: str) -> str:    """Hash a password."""    return bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()async def create_access_token(    data: dict[str, Any],     expires_delta: timedelta | None = None) -> str:    """Create a JWT access token."""    to_encode = data.copy()    if expires_delta:        expire = datetime.now(UTC).replace(tzinfo=None) + expires_delta    else:        expire = datetime.now(UTC).replace(tzinfo=None) + timedelta(minutes=15)    to_encode.update({"exp": expire})    return jwt.encode(to_encode, SECRET_KEY, algorithm="HS256")async def verify_token(token: str, db: AsyncSession) -> TokenData | None:    """Verify a JWT token and extract the user data."""    try:        payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])        username_or_email: str = payload.get("sub")        if username_or_email is None:            return None        return TokenData(username_or_email=username_or_email)    except JWTError:        return Noneasync def authenticate_user(username_or_email: str, password: str, db: AsyncSession):    if "@" in username_or_email:        db_user: dict | None = await crud_users.get(db=db, email=username_or_email, is_deleted=False)    else:        db_user = await crud_users.get(db=db, username=username_or_email, is_deleted=False)    if not db_user:        return False    elif not await verify_password(password, db_user["hashed_password"]):        return False    return db_user# Dependencyasync def get_current_user(    token: Annotated[str, Depends(oauth2_scheme)],     db: Annotated[AsyncSession, Depends(get_session)]) -> dict[str, Any] | None:    """Get the current authenticated user."""    token_data = await verify_token(token, db)    if token_data is None:        raise HTTPException(status_code=401, detail="User not authenticated.")    if "@" in token_data.username_or_email:        user = await crud_users.get(            db=db, email=token_data.username_or_email, is_deleted=False        )    else:        user = await crud_users.get(            db=db, username=token_data.username_or_email, is_deleted=False        )    if user:        return user    raise HTTPException(status_code=401, detail="User not authenticated.")
  • verify_password: 根据哈希密码验证普通密码。它用于检查用户提供的密码是否与存储的哈希密码匹配。
  • get_password_hash: 在将用户提供的密码存储到数据库之前对其进行哈希处理。
  • create_access_token: 用于为经过身份验证的用户生成 JWT 类型的令牌。
  • verify_token: 验证 JWT 令牌并提取用户数据。
  • authenticate_user: 负责根据用户的用户名或电子邮件和密码对用户进行身份验证。
  • get_current_user: 是一种依赖项,它根据提供的令牌检索当前经过身份验证的用户。

现在,让我们使用这些实用程序函数来创建用户路由。

# app/routes.pyfrom datetime import timedeltafrom fastapi import APIRouter, Depends, HTTPExceptionfrom .database import get_sessionfrom .schemas import UserCreate, UserReadfrom .helper import (    get_password_hash,     authenticate_user,     create_access_token,     get_current_user,     Token)# ------- user -------user_router = APIRouter()@user_router.post("/register", response_model=UserRead)async def register_user(    user: UserCreate,     db: AsyncSession = Depends(get_session)):    hashed_password = get_password_hash(user.password)    user_data = user.dict()    user_data["hashed_password"] = hashed_password    del user_data["password"]        new_user = await crud_users.create(        db,         object=UserCreateInternal(**user_data)    )    return new_user@user_router.post("/login", response_model=Token)async def login_user(user: UserCreate, db: AsyncSession = Depends(get_session)):    db_user = await crud_users.get(db, email=user.email)    password_verified = await verify_password(      user.password, db_user.hashed_password    )    if not db_user or not password_verified:        raise HTTPException(status_code=400, detail="Invalid credentials")        access_token_expires = timedelta(minutes=30)    access_token = await create_access_token(        data={"sub": user["username"]},         expires_delta=access_token_expires    )    return {"access_token": access_token, "token_type": "bearer"}

并将路由器包含在我们的应用程序中:

# app/main.pyfrom fastapi import FastAPIfrom .database import create_db_and_tablesfrom .routes import user_router, email_router, log_routerasync def lifespan(app):    await create_db_and_tables()    yieldapp = FastAPI(lifespan=lifespan)app.include_router(user_router, prefix="/users", tags=["Users"])app.include_router(email_router, prefix="/generate", tags=["Email"])app.include_router(log_router, prefix="/logs", tags=["Logs"])

      最后,让我们在 generate_email 端点中注入 get_current_user 依赖项,添加用户登录以生成电子邮件的需求,此外,还会自动将用户的 ID 存储在日志中:

​# app/routes.py...@email_router.post("/", response_model=EmailResponse)async def generate_email(    request: EmailRequest,     db: AsyncSession = Depends(get_session),    current_user: dict = Depends(get_current_user)):    try:        prompt = f"""        Write an email based on the following input:        - User Input: {request.user_input}        - Reply To: {request.reply_to if request.reply_to else 'N/A'}        - Context: {request.context if request.context else 'N/A'}        - Length: {request.length if request.length else 'N/A'} characters        - Tone: {request.tone if request.tone else 'N/A'}        """                response = open_ai_client.chat.completions.create(            model="gpt-3.5-turbo",            messages=[                {"role": "system", "content": "You are a helpful email assistant."},                {"role": "user", "content": prompt}            ],            max_tokens=request.length        )        generated_email = response.choices[0].message.content        log_entry = EmailLogCreate(            user_id=current_user['id'],            user_input=request.user_input,            reply_to=request.reply_to,            context=request.context,            length=request.length,            tone=request.tone,            generated_email=generated_email,        )        await crud_email_logs.create(db, log_entry)        return EmailResponse(generated_email=generated_email)    except Exception as e:        raise HTTPException(status_code=500, detail=str(e))

如果现在检查终端节点,您将在右侧看到一个小锁。

      现在运行程序,需要进行身份验证,您可以通过单击锁并在此处传递有效的用户名和密码(您创建的用户)来完成:

     现在,我们还将此依赖项设置为日志端点,此外,让我们使用 FastCRUD 仅过滤当前用户 ID 的日志。

   我们可以通过注入 get_current_user 依赖项并将 user_id=current_user[“id”] 传递给 FastCRUD 来实现这一点(当前用户是 get_current_user 返回的)。

...# ------- email log -------log_router = APIRouter()@log_router.get("/")async def read_logs(    db: AsyncSession = Depends(get_session),    current_user: dict[str, Any] = Depends(get_current_user)):    logs = await crud_email_logs.get_multi(db, user_id=current_user["id"])    return logs@log_router.get("/{log_id}", response_model=EmailLogRead)async def read_log(    log_id: int,     db: AsyncSession = Depends(get_session),    current_user: dict[str, Any] = Depends(get_current_user)):    log = await crud_email_logs.get(db, id=log_id, user_id=current_user["id"])    if not log:        raise HTTPException(status_code=404, detail="Log not found")    return log

      现在,我们实际上只能读取我们自己的日志,而且,只有在登录时才能读取。

最终的 routes 文件:

# app/routes.pyimport osfrom typing import Annotated, Anyfrom datetime import timedeltafrom fastapi import APIRouter, Depends, HTTPExceptionfrom fastapi.security import OAuth2PasswordRequestFormfrom sqlalchemy.ext.asyncio.session import AsyncSessionfrom starlette.config import Configfrom openai import OpenAIfrom .crud import crud_email_logs, crud_usersfrom .database import get_sessionfrom .schemas import (    EmailRequest,     EmailResponse,     EmailLogCreate,     EmailLogRead,    UserCreate,     UserRead,     UserCreateInternal, )from .helper import (    get_password_hash,     authenticate_user,     create_access_token,     get_current_user,     Token)current_file_dir = os.path.dirname(os.path.realpath(__file__))env_path = os.path.join(current_file_dir, ".env")config = Config(env_path)OPENAI_API_KEY = config("OPENAI_API_KEY")open_ai_client = OpenAI(api_key=OPENAI_API_KEY)# ------- user -------user_router = APIRouter()@user_router.post("/register", response_model=UserRead)async def register_user(    user: UserCreate,     db: AsyncSession = Depends(get_session)):    hashed_password = get_password_hash(user.password)    user_data = user.dict()    user_data["hashed_password"] = hashed_password    del user_data["password"]        new_user = await crud_users.create(        db,         object=UserCreateInternal(**user_data)    )    return new_user@user_router.post("/login", response_model=Token)async def login_user(    form_data: Annotated[OAuth2PasswordRequestForm, Depends()],    db: AsyncSession = Depends(get_session)):    user = await authenticate_user(        username_or_email=form_data.username,         password=form_data.password,         db=db    )    if not user:        raise HTTPException(status_code=400, detail="Invalid credentials")        access_token_expires = timedelta(minutes=30)    access_token = await create_access_token(        data={"sub": user["username"]},         expires_delta=access_token_expires    )    return {"access_token": access_token, "token_type": "bearer"}# ------- email -------email_router = APIRouter()@email_router.post("/", response_model=EmailResponse)async def generate_email(    request: EmailRequest,     db: AsyncSession = Depends(get_session),    current_user: dict = Depends(get_current_user)):    try:        system_prompt = f"""        You are a helpful email assistant.         You get a prompt to write an email,        you reply with the email and nothing else.        """        prompt = f"""        Write an email based on the following input:        - User Input: {request.user_input}        - Reply To: {request.reply_to if request.reply_to else 'N/A'}        - Context: {request.context if request.context else 'N/A'}        - Length: {request.length if request.length else 'N/A'} characters        - Tone: {request.tone if request.tone else 'N/A'}        """                response = open_ai_client.chat.completions.create(            model="gpt-3.5-turbo",            messages=[                {"role": "system", "content": system_prompt},                {"role": "user", "content": prompt}            ],            max_tokens=request.length        )        generated_email = response.choices[0].message.content        log_entry = EmailLogCreate(            user_id=current_user['id'],            user_input=request.user_input,            reply_to=request.reply_to,            context=request.context,            length=request.length,            tone=request.tone,            generated_email=generated_email,        )        await crud_email_logs.create(db, log_entry)        return EmailResponse(generated_email=generated_email)    except Exception as e:        raise HTTPException(status_code=500, detail=str(e))# ------- email log -------log_router = APIRouter()@log_router.get("/")async def read_logs(    db: AsyncSession = Depends(get_session),    current_user: dict[str, Any] = Depends(get_current_user)):    logs = await crud_email_logs.get_multi(db, user_id=current_user["id"])    return logs@log_router.get("/{log_id}", response_model=EmailLogRead)async def read_log(    log_id: int,     db: AsyncSession = Depends(get_session),    current_user: dict[str, Any] = Depends(get_current_user)):    log = await crud_email_logs.get(db, id=log_id, user_id=current_user["id"])    if not log:        raise HTTPException(status_code=404, detail="Log not found")    return log

参考文献

[1] https://github.com/igorbenav/fastcrud?tab=readme-ov-file

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/489684.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

40 list类 模拟实现

目录 一、list类简介 (一)概念 (二)list与string和vector的区别 二、list类使用 (一)构造函数 (二)迭代器 (三)list capacity (四&#x…

迎接全新的 Kotlin 支持 – K2 模式:基本信息

K2 模式有什么作用? K2 模式是 IntelliJ IDEA 中 Kotlin 支持的新实现,它可以提高 IDE 的稳定性,同时也会为支持未来 Kotlin 语言功能奠定基础。 K2 模式与 Kotlin K2 编译器有什么区别? K2 编译器负责编译 Kotlin 语言 2.0 或…

openGauss开源数据库实战二十四

文章目录 任务二十四 openGaussss WAL管理和归档管理任务目标实施步骤一、WAL管理1.不能修改的WAL参数2.可以修改的WAL参数 二、配置openGauss工作在归档模式1.查看当前的归档设置2.停止openGauss数据库3.创建归档日志的保存目录4.修改启动参数文件5.重新启动openGauss数据库6.…

docker 安装mysql 5.7 详细保姆级教程

1. 安装mysql(5.7) docker pull mysql:5.7 若是拉取不了,可以配置下 docker 源 2. 查看是否安装成功 docker images 下图就是成功了 3.创建mysql专用目录、数据挂载目录、配置文件目录 ,演示目录在于/home/下 //命令逐条执行cd /home/ mkdir mysql …

scale index的计算

scale index定义 基本实现 需要注意,scale index的提出者分别构建了MATLAB和R语言的实现方式。 但是,需要注意,经过我向作者求证。 MATLAB编写的代码已经“过时了”,为了拥抱时代,作者构建了R语言包,名称为…

The Rise and Potential of Large Language ModelBased Agents:A Survey---摘要、背景、引言

题目 基于大语言模型的Agent的兴起与发展前景 论文地址:https://arxiv.org/pdf/2309.07864.pdf 项目地址:https:/github.com/WooooDyy./LLM-Agent–Paper-List 摘要 长期以来,人类一直在追求等同于或超越人类水平的人工智能(A),…

西门子200 smart PLC助力水处理企业自动化改造

摘要 西门子的200SMART PLC,以其强大的功能和灵活的应用性,正成为环保行业中不可或缺的一环。今天,我们就来看看这个小小的PLC是如何在处理环保问题中大显身手的。 不得不说,环保行业的痛点可不少。 比如污水处理,传…

运维实战:K8s 上的 Doris 高可用集群最佳实践

今天我们将深入探讨::如何在 K8s 集群上部署 Compute storage coupled(存算耦合) 模式的 Doris 高可用集群? 本文,我将为您提供一份全面的实战指南,逐步引导您完成以下关键任务: 配…

意图识别模型使用 基于BERT的对话意图和槽位联合识别 CPU运行BERT模型-亲测成功

意图识别模型使用 基于BERT的对话意图和槽位联合识别 CPU运行BERT模型-亲测成功 我们在开发AI-Agent智能体时,通常会使用提示词工程设置场景的带入,在实际项目中会有很多场景,如果所有提示词都放一起就会超过Token限制,则不得不拆…

网管平台(基础篇):路由器的介绍与管理

路由器简介 路由器(Router)是一种计算机网络设备,它的主要作用是将数据通过打包,并按照一定的路径选择算法,将网络传送至目的地。路由器能够连接两个或更多个网络,并根据信道的情况自动选择和设定路由&…

开发者工具的模块化与可扩展性设计

文章目录 前言模块化设计的重要性可扩展性设计的重要性设计模式与技术实现实战代码插件管理器类:PluginManager注册插件方法:register_plugin执行插件方法:execute_plugin 插件实现插件 1:代码格式化插件插件 2:代码行…

杭州乘云联合信通院发布《云计算智能化可观测性能力成熟度模型》

原文地址:杭州乘云联合中国信通院等单位正式发布《云计算智能化可观测性能力成熟度模型》标准 2024年12月3日,由全球数字经济大会组委会主办、中国信通院承办的 2024全球数字经济大会 云AI计算创新发展大会(2024 Cloud AI Compute Ignite&…

WordPress酱茄主题 开源版 博客资讯自媒体网站模板

一款免费开源的WordPress主题,主题专为WordPress博客、资讯、自媒体网站而设计 运行环境 支持WordPress版本:5.6 兼容Chrome、Firefox、Safari等主流浏览器 支持设备:响应式布局,不同设备不同展示效果 服务器环境建议&#x…

16-在线blog发布系统

【技术栈】 ①:架构: B/S、MVC ②:系统环境:Windows/Mac ③:开发环境:IDEA、JDK1.8、Maven、Mysql ④:技术栈:Java、Mysql、SpringBoot、Mybatis、Vue、Redis 【功能模块】 ①:登…

从0到1实现项目Docker编排部署

在深入讨论 Docker 编排之前,首先让我们了解一下 Docker 技术本身。Docker 是一个开源平台,旨在帮助开发者自动化应用程序的部署、扩展和管理。自 2013 年推出以来,Docker 迅速发展成为现代软件开发和运维领域不可或缺的重要工具。 Docker 采…

1. 机器学习基本知识(2)——机器学习分类

1.4 机器学习分类 1.4.1 训练监督 1. 监督学习:已对训练数据完成标记 分类:根据数据及其分类信息来进行训练,使模型能够对新的数据进行分类 回归:给出一组特征值来预测目标数值 2. 无监督学习:没有对训练数据进行任…

快速将请求头构建成json结构

1.背景 有时候我们要爬虫(组包)请求一个资源数据,需要构建与原始请求一样的请求头,从浏览器复制过来的请求头,有很多,如果一个一个的配置成json有点慢,那么如何快速构建呢? 今天就使用正则表达式的方式实现 正则表达式实现快速将请求头构建成json结构 将冒号后边的换行符去掉…

【蓝桥杯备战】Day 1

1.基础题目 LCR 018.验证回文串 给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。 本题中,将空字符串定义为有效的 回文串 。 示例 1: 输入: s "A man, a plan, a canal: Panama…

在 Ubuntu 24.04.1 LTS (WSL) 中使用 openssl 生成 keybox.xml

看到“生成 keybox.xml”,大概率都会联想到 PIF 和 Tricky Store。这里就不多解释它们的用途了。最近在网上看到生成非 AOSP keybox 的教程,在这里做一些补充,并将代码打包成一个 Python 脚本。 参考自: Idea 提供者&#xff1a…

哈夫曼树选择题

1. 哈夫曼树的构建方法 哈夫曼树是通过不断合并权值最小的两个节点生成的: 将权值最小的两个节点合并成一个新节点,权值为这两个节点权值之和。将新节点加入队列,并从队列中移除已合并的两个节点。重复以上步骤,直到所有节点合并…