Commit 0804f32e by tinywell

镜像编译及容器部署

parent 0a2be35f
tmp
claie_crawler
faiss
gradio_file
init_db
lae_pg_data
test
\ No newline at end of file
# 使用官方的Python 3.10基础镜像 # 使用官方的Python 3.11基础镜像
FROM python:3.10 FROM python:3.11
# 设置工作目录 # 设置工作目录
WORKDIR /app WORKDIR /app
...@@ -12,10 +12,6 @@ RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple ...@@ -12,10 +12,6 @@ RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 配置python环境 # 配置python环境
RUN pip install --no-cache-dir -r requirements.txt RUN pip install --no-cache-dir -r requirements.txt
RUN mv /usr/local/lib/python3.10/site-packages/gradio/templates/frontend/index.html /usr/local/lib/python3.10/site-packages/gradio/templates/frontend/index.html.back
RUN mv /usr/local/lib/python3.10/site-packages/gradio/templates/frontend/share.html /usr/local/lib/python3.10/site-packages/gradio/templates/frontend/share.html.back
RUN cp /app/gradio_file/index.html /usr/local/lib/python3.10/site-packages/gradio/templates/frontend
RUN cp /app/gradio_file/share.html /usr/local/lib/python3.10/site-packages/gradio/templates/frontend
# 运行一个简单的Python命令以确保环境正确配置 # 运行一个简单的Python命令以确保环境正确配置
CMD ["python", "test/gradio_test.py"] CMD cd src && python controller/api.py
\ No newline at end of file
lae_agent:
docker build -t brilliance/lae_agent .
version: '3'
services: services:
postgres: lae_agent:
image: postgres image: brilliance/lae_agent
container_name: lae_pgsql container_name: lae_agent
environment: environment:
POSTGRES_PASSWORD: 111111 # GEO_AGENT_TOOL_BASE_URL: http://localhost:5001
GEO_AGENT_TOOL_BASE_URL: http://172.30.0.37:30007
# GEO_AGENT_API_BASE: http://192.168.10.14:8000/v1
# GEO_AGENT_LLM_MODEL: Qwen2-7B
ports: ports:
- "5434:5432" - "8088:8088"
volumes:
- ./lae_pg_data:/var/lib/postgresql/data
- ./init_db/create_db.sql:/docker-entrypoint-initdb.d/create_db.sql
- ./init_db/create_table.sql:/docker-entrypoint-initdb.d/create_table.sql
#bitsandbytes==0.41.1
cpm-kernels==1.0.11
fastapi==0.100.0 fastapi==0.100.0
Flask==2.1.1 langchain
jieba==0.42.1 langchain-openai
langchain==0.1.13 langchain-community
peft==0.4.0 langchain-core
psycopg2==2.9.7
pydantic==1.10.12 pydantic==1.10.12
requests==2.31.0 requests==2.31.0
sentence-transformers==2.2.2
transformers==4.31.0
uvicorn==0.23.1 uvicorn==0.23.1
unstructured==0.8.1 unstructured==0.8.1
\ No newline at end of file
bs4==0.0.1
mdtex2html==1.2.0
faiss-cpu==1.7.2 # https://github.com/facebookresearch/faiss/blob/main/INSTALL.md
gradio==3.48.0
qianfan==0.3.13.1
modelscope==1.14.0
wkhtmltopdf==0.2
pdfkit==1.0.0
\ No newline at end of file
import httpx import httpx
from typing import List, Optional, Dict, TypeVar, Generic, Any from typing import TypeVar, Generic, Any, Optional, List, Dict
from pydantic import BaseModel from pydantic import BaseModel
import asyncio
from urllib.parse import urljoin from urllib.parse import urljoin
# 泛型类型定义 # 泛型类型定义
......
from typing import Dict, List, Tuple, Any, Optional from typing import Dict, List, Tuple, Any, Optional
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from datetime import datetime
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from typing import Type from typing import Type
from langchain_core.tools import BaseTool from langchain_core.tools import BaseTool
...@@ -17,7 +13,7 @@ class BaseRateTool(BaseTool): ...@@ -17,7 +13,7 @@ class BaseRateTool(BaseTool):
def __init__(self, **data): def __init__(self, **data):
super().__init__(**data) super().__init__(**data)
def format_response(self, data: Dict[str, Any], chart: go.Figure) -> Dict[str, Any]: def format_response(self, data: Dict[str, Any], chart: Any) -> Dict[str, Any]:
"""格式化返回结果""" """格式化返回结果"""
return { return {
'data': data, 'data': data,
......
import os
import sys import sys
import argparse
sys.path.append('../') sys.path.append('../')
import argparse
from typing import Optional
from fastapi import FastAPI, Header from fastapi import FastAPI, Header
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
import uvicorn import uvicorn
from src.server.agent_rate import new_rate_agent from src.server.agent_rate import new_rate_agent
from src.server.classify import new_router_llm from src.server.classify import new_router_llm
from src.controller.request import GeoAgentRateRequest from src.controller.request import GeoAgentRateRequest
from langchain_openai import ChatOpenAI from langchain_openai import ChatOpenAI
# 默认配置
DEFAULT_CONFIG = {
"PORT": 8088,
"HOST": "0.0.0.0",
"LLM_MODEL": "Qwen2-7B",
"API_BASE": "http://192.168.10.14:8000/v1",
"TOOL_BASE_URL": "http://localhost:5001",
"API_KEY": "xxxxxxxxxxxxx"
}
def get_config(key: str, args: Optional[argparse.Namespace] = None) -> str:
"""
获取配置值,优先级:环境变量 > 命令行参数 > 默认值
Args:
key: 配置键名
args: 命令行参数对象
Returns:
str: 配置值
"""
# 环境变量名转换为大写
env_key = f"GEO_AGENT_{key.upper()}"
# 优先从环境变量获取
value = os.getenv(env_key)
if value is not None:
return value
print(f"env_key: {env_key} value: {value}")
# 其次从命令行参数获取
if args is not None:
arg_value = getattr(args, key.lower(), None)
if arg_value is not None:
return str(arg_value)
# 最后使用默认值
return str(DEFAULT_CONFIG[key.upper()])
app = FastAPI() app = FastAPI()
app.add_middleware( app.add_middleware(
CORSMiddleware, CORSMiddleware,
allow_origins=["*"], # 允许所有域访问,也可以指定特定域名 allow_origins=["*"],
allow_credentials=True, allow_credentials=True,
allow_methods=["*"], # 允许所有HTTP方法 allow_methods=["*"],
allow_headers=["*"], # 允许所有HTTP头 allow_headers=["*"],
) )
global base_llm, tool_base_url
base_llm = None
tool_base_url = None
class AgentManager: class AgentManager:
def __init__(self): def __init__(self):
self.llm = None self.llm = None
self.agent = None self.agent = None
self.router_llm = None
def initialize(self, api_key: str, api_base: str, model_name: str, tool_base_url: str): def initialize(self, api_key: str, api_base: str, model_name: str, tool_base_url: str):
self.llm = ChatOpenAI( self.llm = ChatOpenAI(
...@@ -35,7 +76,7 @@ class AgentManager: ...@@ -35,7 +76,7 @@ class AgentManager:
model_name=model_name, model_name=model_name,
verbose=True verbose=True
) )
self.agent = new_rate_agent(self.llm,verbose=True,tool_base_url=tool_base_url) self.agent = new_rate_agent(self.llm, verbose=True, tool_base_url=tool_base_url)
self.router_llm = new_router_llm(self.llm) self.router_llm = new_router_llm(self.llm)
def get_llm(self): def get_llm(self):
...@@ -49,10 +90,8 @@ class AgentManager: ...@@ -49,10 +90,8 @@ class AgentManager:
agent_manager = AgentManager() agent_manager = AgentManager()
@app.post('/api/agent/rate') @app.post('/api/agent/rate')
def rate(chat_request: GeoAgentRateRequest, token: str = Header(None)): def rate(chat_request: GeoAgentRateRequest, token: str = Header(None)):
agent = agent_manager.get_agent() agent = agent_manager.get_agent()
try: try:
res = agent.exec(prompt_args={"input": chat_request.query}) res = agent.exec(prompt_args={"input": chat_request.query})
...@@ -69,7 +108,6 @@ def rate(chat_request: GeoAgentRateRequest, token: str = Header(None)): ...@@ -69,7 +108,6 @@ def rate(chat_request: GeoAgentRateRequest, token: str = Header(None)):
@app.post('/api/classify') @app.post('/api/classify')
def classify(chat_request: GeoAgentRateRequest): def classify(chat_request: GeoAgentRateRequest):
llm = agent_manager.get_router_llm() llm = agent_manager.get_router_llm()
try: try:
res = llm.invoke(chat_request.query) res = llm.invoke(chat_request.query)
...@@ -84,22 +122,43 @@ def classify(chat_request: GeoAgentRateRequest): ...@@ -84,22 +122,43 @@ def classify(chat_request: GeoAgentRateRequest):
'data': res 'data': res
} }
def main():
if __name__ == "__main__": # 命令行参数解析
# 参数解析
parser = argparse.ArgumentParser(description="启动API服务") parser = argparse.ArgumentParser(description="启动API服务")
parser.add_argument("--port", type=int, default=8088, help="API服务端口") parser.add_argument("--port", type=int, help="API服务端口")
parser.add_argument("--host", type=str, default='0.0.0.0', help="API服务地址") parser.add_argument("--host", type=str, help="API服务地址")
parser.add_argument("--llm", type=str, default='Qwen2-7B', help="API服务地址") parser.add_argument("--llm", type=str, help="LLM模型名称")
parser.add_argument("--api_base", type=str, default='http://192.168.10.14:8000/v1', help="API服务地址") parser.add_argument("--api_base", type=str, help="OpenAI API基础地址")
parser.add_argument("--tool_base_url", type=str, default='http://localhost:5001', help="API服务地址") parser.add_argument("--tool_base_url", type=str, help="工具服务基础地址")
parser.add_argument("--api_key", type=str, help="OpenAI API密钥")
args = parser.parse_args() args = parser.parse_args()
# 获取配置
port = int(get_config("PORT", args))
host = get_config("HOST", args)
llm_model = get_config("LLM_MODEL", args)
api_base = get_config("API_BASE", args)
tool_base_url = get_config("TOOL_BASE_URL", args)
api_key = get_config("API_KEY", args)
# 初始化 agent
agent_manager.initialize( agent_manager.initialize(
api_key='xxxxxxxxxxxxx', api_key=api_key,
api_base=args.api_base, api_base=api_base,
model_name=args.llm, model_name=llm_model,
tool_base_url=args.tool_base_url tool_base_url=tool_base_url
) )
uvicorn.run(app, host=args.host, port=args.port) # 启动服务
print(f"Starting server with configuration:")
print(f"Host: {host}")
print(f"Port: {port}")
print(f"LLM Model: {llm_model}")
print(f"API Base: {api_base}")
print(f"Tool Base URL: {tool_base_url}")
uvicorn.run(app, host=host, port=port)
if __name__ == "__main__":
main()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment