427 lines
11 KiB
Markdown
427 lines
11 KiB
Markdown
|
|
# 青岛岗位匹配系统
|
|||
|
|
|
|||
|
|
基于Go开发的智能岗位匹配系统,兼容OpenAI `/v1/chat/completions` API接口。
|
|||
|
|
|
|||
|
|
## 配置文档
|
|||
|
|
|
|||
|
|
### 完整配置示例
|
|||
|
|
|
|||
|
|
编辑 `config.yaml`:
|
|||
|
|
|
|||
|
|
```yaml
|
|||
|
|
# 服务器配置
|
|||
|
|
server:
|
|||
|
|
port: 8080 # 服务端口
|
|||
|
|
host: "0.0.0.0" # 监听地址
|
|||
|
|
read_timeout: 30s # 读取请求超时
|
|||
|
|
write_timeout: 300s # 写入响应超时(流式响应需要更长时间)
|
|||
|
|
|
|||
|
|
# LLM配置
|
|||
|
|
llm:
|
|||
|
|
base_url: "https://your-llm-api.com/v1" # LLM API地址
|
|||
|
|
api_key: "sk-xxx" # LLM API密钥
|
|||
|
|
model: "gpt-4o" # 默认模型
|
|||
|
|
timeout: 120s # 请求超时
|
|||
|
|
max_retries: 3 # 最大重试次数
|
|||
|
|
|
|||
|
|
# 高德地图配置
|
|||
|
|
amap:
|
|||
|
|
api_key: "your-amap-key" # 高德地图API密钥
|
|||
|
|
base_url: "https://restapi.amap.com/v3" # 高德API地址
|
|||
|
|
timeout: 10s # 请求超时
|
|||
|
|
|
|||
|
|
# 岗位API配置
|
|||
|
|
job_api:
|
|||
|
|
base_url: "https://job-api.example.com" # 岗位API地址
|
|||
|
|
timeout: 30s # 请求超时
|
|||
|
|
|
|||
|
|
# OCR服务配置(文件解析)
|
|||
|
|
ocr:
|
|||
|
|
base_url: "https://your-ocr-api.example.com" # OCR服务地址(外网)
|
|||
|
|
# base_url: "http://127.0.0.1:9001" # OCR服务地址(内网)
|
|||
|
|
timeout: 120s # 请求超时
|
|||
|
|
|
|||
|
|
# 政策咨询配置
|
|||
|
|
policy:
|
|||
|
|
base_url: "http://policy-api.example.com" # 政策API地址
|
|||
|
|
login_name: "your_login_name" # 登录用户名
|
|||
|
|
user_key: "your_user_key" # 用户密钥
|
|||
|
|
service_id: "your_service_id" # 服务ID
|
|||
|
|
timeout: 60s # 请求超时
|
|||
|
|
|
|||
|
|
# 日志配置
|
|||
|
|
logging:
|
|||
|
|
level: "info" # 日志级别:debug, info, warn, error
|
|||
|
|
format: "json" # 日志格式:json, text
|
|||
|
|
|
|||
|
|
# 性能配置
|
|||
|
|
performance:
|
|||
|
|
max_goroutines: 10000 # 最大并发goroutine数
|
|||
|
|
goroutine_pool_size: 5000 # goroutine池大小
|
|||
|
|
task_queue_size: 10000 # 任务队列大小
|
|||
|
|
enable_pprof: true # 启用pprof性能分析(设为 false 可关闭 /debug/pprof/*)
|
|||
|
|
enable_metrics: true # 启用指标收集(设为 false 可关闭 /metrics 与指标中间件)
|
|||
|
|
gc_percent: 100 # GC触发百分比
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 环境变量配置
|
|||
|
|
|
|||
|
|
环境变量会自动覆盖配置文件中的值(推荐生产环境使用):
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 服务器
|
|||
|
|
export SERVER_PORT="8080"
|
|||
|
|
export SERVER_HOST="0.0.0.0"
|
|||
|
|
|
|||
|
|
# LLM
|
|||
|
|
export LLM_API_KEY="sk-xxx"
|
|||
|
|
export LLM_BASE_URL="https://your-llm-api.com/v1"
|
|||
|
|
export LLM_MODEL="gpt-4o"
|
|||
|
|
|
|||
|
|
# 高德地图
|
|||
|
|
export AMAP_API_KEY="your-amap-key"
|
|||
|
|
|
|||
|
|
# OCR服务
|
|||
|
|
export OCR_BASE_URL="https://your-ocr-api.example.com"
|
|||
|
|
|
|||
|
|
# 岗位API
|
|||
|
|
export JOB_API_BASE_URL="https://job-api.example.com"
|
|||
|
|
|
|||
|
|
# 政策API
|
|||
|
|
export POLICY_BASE_URL="http://policy-api.example.com"
|
|||
|
|
export POLICY_LOGIN_NAME="your_login_name"
|
|||
|
|
export POLICY_USER_KEY="your_user_key"
|
|||
|
|
export POLICY_SERVICE_ID="your_service_id"
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 运行
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 安装依赖
|
|||
|
|
go mod download
|
|||
|
|
|
|||
|
|
# 直接运行
|
|||
|
|
go run cmd/server/main.go
|
|||
|
|
|
|||
|
|
# 或编译后运行
|
|||
|
|
make build
|
|||
|
|
./qd-sc-server
|
|||
|
|
|
|||
|
|
# 使用自定义配置文件
|
|||
|
|
./qd-sc-server -config=/path/to/config.yaml
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
服务启动在 `http://localhost:8080`
|
|||
|
|
|
|||
|
|
## API端点
|
|||
|
|
|
|||
|
|
系统提供以下端点:
|
|||
|
|
|
|||
|
|
| 端点 | 方法 | 说明 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| `/` | GET | API信息和端点列表 |
|
|||
|
|
| `/health` | GET | 健康检查 |
|
|||
|
|
| `/metrics` | GET | 性能指标(需启用 `performance.enable_metrics`) |
|
|||
|
|
| `/v1/chat/completions` | POST | OpenAI兼容的聊天接口(主要接口) |
|
|||
|
|
| `/debug/pprof/*` | GET | 性能分析(pprof,需启用 `performance.enable_pprof`) |
|
|||
|
|
|
|||
|
|
## API调用
|
|||
|
|
|
|||
|
|
### 1. 普通对话
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost:8080/v1/chat/completions \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{
|
|||
|
|
"model": "qd-job-turbo",
|
|||
|
|
"messages": [
|
|||
|
|
{"role": "user", "content": "帮我推荐城阳区的Java开发岗位"}
|
|||
|
|
],
|
|||
|
|
"stream": true
|
|||
|
|
}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 带文件URL(Vision API 兼容格式)
|
|||
|
|
|
|||
|
|
通过 `image_url` 字段发送文件 URL,支持图片、PDF、Excel、PPT 等格式:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost:8080/v1/chat/completions \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{
|
|||
|
|
"model": "qd-job-turbo",
|
|||
|
|
"messages": [
|
|||
|
|
{
|
|||
|
|
"role": "user",
|
|||
|
|
"content": [
|
|||
|
|
{"type": "text", "text": "根据这份简历推荐岗位"},
|
|||
|
|
{"type": "image_url", "image_url": {"url": "https://example.com/resume.pdf"}}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"stream": true
|
|||
|
|
}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
> **说明**: `image_url` 是 OpenAI Vision API 的兼容字段名,实际支持图片、PDF、Excel、PPT 等多种文件格式。
|
|||
|
|
|
|||
|
|
### 3. 多轮对话
|
|||
|
|
|
|||
|
|
支持上下文对话,只需在 `messages` 中包含历史消息:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl -X POST http://localhost:8080/v1/chat/completions \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-d '{
|
|||
|
|
"model": "qd-job-turbo",
|
|||
|
|
"messages": [
|
|||
|
|
{"role": "user", "content": "我想找Java开发岗位"},
|
|||
|
|
{"role": "assistant", "content": "好的,请问您希望在哪个区域找工作?"},
|
|||
|
|
{"role": "user", "content": "城阳区"}
|
|||
|
|
],
|
|||
|
|
"stream": true
|
|||
|
|
}'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 请求参数说明
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"model": "qd-job-turbo", // 必填:固定模型名称
|
|||
|
|
"messages": [ // 必填:对话消息列表
|
|||
|
|
{
|
|||
|
|
"role": "user", // 角色:user, assistant, system
|
|||
|
|
"content": "你的问题" // 消息内容
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"stream": true, // 可选:是否流式输出(推荐true)
|
|||
|
|
"temperature": 0.7, // 可选:温度参数(0-2)
|
|||
|
|
"max_tokens": 2000, // 可选:最大生成token数
|
|||
|
|
"top_p": 1.0, // 可选:nucleus采样参数
|
|||
|
|
"presence_penalty": 0.0, // 可选:存在惩罚
|
|||
|
|
"frequency_penalty": 0.0 // 可选:频率惩罚
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5. 响应格式
|
|||
|
|
|
|||
|
|
**流式响应**(`stream: true`):
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
data: {"id":"chatcmpl-xxx","object":"chat.completion.chunk","created":1234567890,"model":"qd-job-turbo","choices":[{"index":0,"delta":{"role":"assistant","content":"您好"},"finish_reason":null}]}
|
|||
|
|
|
|||
|
|
data: {"id":"chatcmpl-xxx","object":"chat.completion.chunk","created":1234567890,"model":"qd-job-turbo","choices":[{"index":0,"delta":{"content":","},"finish_reason":null}]}
|
|||
|
|
|
|||
|
|
data: [DONE]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**非流式响应**(`stream: false`):
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"id": "chatcmpl-xxx",
|
|||
|
|
"object": "chat.completion",
|
|||
|
|
"created": 1234567890,
|
|||
|
|
"model": "qd-job-turbo",
|
|||
|
|
"choices": [
|
|||
|
|
{
|
|||
|
|
"index": 0,
|
|||
|
|
"message": {
|
|||
|
|
"role": "assistant",
|
|||
|
|
"content": "您好,我可以帮您推荐岗位..."
|
|||
|
|
},
|
|||
|
|
"finish_reason": "stop"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
"usage": {
|
|||
|
|
"prompt_tokens": 100,
|
|||
|
|
"completion_tokens": 50,
|
|||
|
|
"total_tokens": 150
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 内置功能
|
|||
|
|
|
|||
|
|
系统会根据对话自动调用以下工具:
|
|||
|
|
|
|||
|
|
1. **queryLocation** - 查询地点坐标(高德地图)
|
|||
|
|
2. **queryJobsByArea** - 按区域查询岗位
|
|||
|
|
3. **queryJobsByLocation** - 按坐标查询岗位
|
|||
|
|
4. **queryPolicy** - 政策咨询
|
|||
|
|
5. **parsePDF** - PDF解析(OCR服务)
|
|||
|
|
6. **parseImage** - 图片识别(OCR服务)
|
|||
|
|
|
|||
|
|
### 工具参数说明
|
|||
|
|
|
|||
|
|
#### queryJobsByArea(按区域查询岗位)
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"area": 5, // 区域代码(0-9)
|
|||
|
|
"keyword": "Java", // 可选:关键词
|
|||
|
|
"education": 4, // 可选:学历代码
|
|||
|
|
"experience": 5, // 可选:经验代码
|
|||
|
|
"page": 1, // 可选:页码
|
|||
|
|
"pageSize": 20 // 可选:每页数量
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### queryJobsByLocation(按坐标查询岗位)
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"latitude": "36.307527", // 纬度
|
|||
|
|
"longitude": "120.467121", // 经度
|
|||
|
|
"keyword": "Java", // 可选:关键词
|
|||
|
|
"radius": 5000, // 可选:搜索半径(米)
|
|||
|
|
"education": 4, // 可选:学历代码
|
|||
|
|
"experience": 5 // 可选:经验代码
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### queryPolicy(政策咨询)
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"message": "咨询问题", // 必填:咨询内容
|
|||
|
|
"chatId": "xxx", // 可选:会话ID(多轮对话)
|
|||
|
|
"conversationId": "xxx", // 可选:对话ID(多轮对话)
|
|||
|
|
"realName": false, // 可选:是否实名咨询
|
|||
|
|
"aac001": "个人编号", // 实名时必填
|
|||
|
|
"aac147": "身份证号", // 实名时必填
|
|||
|
|
"aac003": "姓名" // 实名时必填
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 代码对照表
|
|||
|
|
|
|||
|
|
#### 区域代码
|
|||
|
|
|
|||
|
|
- 0:市南区, 1:市北区, 2:李沧区, 3:崂山区, 4:黄岛区
|
|||
|
|
- 5:城阳区, 6:即墨区, 7:胶州市, 8:平度市, 9:莱西市
|
|||
|
|
|
|||
|
|
#### 学历代码
|
|||
|
|
|
|||
|
|
- -1:不限, 0:初中及以下, 1:中专/中技, 2:高中, 3:大专
|
|||
|
|
- 4:本科, 5:硕士, 6:博士, 7:MBA/EMBA, 8-10:留学
|
|||
|
|
|
|||
|
|
#### 经验代码
|
|||
|
|
|
|||
|
|
- 0:不限, 1:实习生, 2:应届, 3:1年以下
|
|||
|
|
- 4:1-3年, 5:3-5年, 6:5-10年, 7:10年以上
|
|||
|
|
|
|||
|
|
## 其他端点
|
|||
|
|
|
|||
|
|
### 健康检查
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl http://localhost:8080/health
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
响应:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"status": "ok",
|
|||
|
|
"timestamp": "2024-01-01T12:00:00Z"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 性能指标
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
curl http://localhost:8080/metrics
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
响应:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"requests_total": 1234,
|
|||
|
|
"requests_success": 1200,
|
|||
|
|
"requests_failed": 34,
|
|||
|
|
"avg_response_time_ms": 150.5,
|
|||
|
|
"goroutines": 42,
|
|||
|
|
"memory_alloc_mb": 45.6
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 性能分析(pprof)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# CPU性能分析(采集30秒)
|
|||
|
|
curl http://localhost:8080/debug/pprof/profile?seconds=30 -o cpu.prof
|
|||
|
|
|
|||
|
|
# 内存分析
|
|||
|
|
curl http://localhost:8080/debug/pprof/heap -o heap.prof
|
|||
|
|
|
|||
|
|
# Goroutine分析
|
|||
|
|
curl http://localhost:8080/debug/pprof/goroutine -o goroutine.prof
|
|||
|
|
|
|||
|
|
# 查看分析结果
|
|||
|
|
go tool pprof cpu.prof
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 性能配置
|
|||
|
|
|
|||
|
|
### 限流
|
|||
|
|
|
|||
|
|
系统默认配置:
|
|||
|
|
- **桶容量**: 200(突发请求)
|
|||
|
|
- **补充速率**: 50/秒(持续QPS)
|
|||
|
|
|
|||
|
|
超过限流会返回 `429 Too Many Requests`。
|
|||
|
|
|
|||
|
|
### 连接池
|
|||
|
|
|
|||
|
|
- LLM API: 100最大连接,20/host
|
|||
|
|
- 其他API: 50最大连接,10/host
|
|||
|
|
|
|||
|
|
### 超时配置
|
|||
|
|
|
|||
|
|
- 读取请求: 30秒
|
|||
|
|
- 写入响应: 300秒(流式响应)
|
|||
|
|
- LLM请求: 120秒
|
|||
|
|
- 其他API: 10-60秒
|
|||
|
|
|
|||
|
|
## Docker部署
|
|||
|
|
|
|||
|
|
### 使用docker-compose(推荐)
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker-compose up -d
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 手动构建
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker build -t qd-sc-server .
|
|||
|
|
docker run -d -p 8080:8080 \
|
|||
|
|
-e LLM_API_KEY="sk-xxx" \
|
|||
|
|
-e LLM_BASE_URL="https://your-api.com/v1" \
|
|||
|
|
-e AMAP_API_KEY="xxx" \
|
|||
|
|
-e OCR_BASE_URL="https://your-ocr-api.example.com" \
|
|||
|
|
--name qd-sc-server \
|
|||
|
|
qd-sc-server
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 多架构镜像(amd64/arm64)
|
|||
|
|
|
|||
|
|
> 说明:仓库内 `Dockerfile` 已支持 buildx 的 `TARGETARCH/TARGETOS`,可直接构建 `linux/amd64` + `linux/arm64` 的同 tag 多架构镜像(manifest)。
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 一次推送多架构(推荐)
|
|||
|
|
docker buildx build --platform linux/amd64,linux/arm64 -t t0ng7u/qd-sc:latest --push .
|
|||
|
|
|
|||
|
|
# 或仅推送 arm64(可选)
|
|||
|
|
docker buildx build --platform linux/arm64 -t t0ng7u/qd-sc:arm64 --push .
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 查看日志
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
docker logs -f qd-sc-server
|
|||
|
|
```
|