first commit

main
S0beRr 2024-11-21 02:15:07 +00:00
commit 6e66ccffd6
7 changed files with 140 additions and 0 deletions

2
.gitignore vendored 100644
View File

@ -0,0 +1,2 @@
/venv/
/__pycache__/

13
Dockerfile 100644
View File

@ -0,0 +1,13 @@
FROM python:3.12
WORKDIR /app
COPY ./requirements.txt ./
RUN pip install -r requirements.txt
COPY ./ /app/
EXPOSE 10000
CMD ["python", "main.py"]

3
config.py 100644
View File

@ -0,0 +1,3 @@
API_KEY = 'ollama'
MODEL = 'qwen2.5:32b-instruct-q5_K_M'
LLM_BASE_URL = 'http://localhost:11434/v1'

16
debug.py 100644
View File

@ -0,0 +1,16 @@
input_text = '''
林鄭月娥大紫荊勳賢GBSJP英語Carrie Lam Cheng Yuet-ngor1957年5月13日[5]前任香港特別行政區行政長官她取得香港大學社會科學學士學位後於1980年加入港英政府成為政務主任在不同部門工作香港回歸後她曾出任發展局局長及政務司司長等多個主要官員職務2017年參加行政長官選舉以777票當選[6]並成為香港首位女性行政長官[7][8][9]
在行政長官任內她因推行修訂逃犯條例草案引發香港修例風波加上支持全國人大常委會在港推行港區國安法引致美國政府施加一系列的制裁[10]成為首位被外國政府制裁的香港官員[11]
生平
林鄭月娥出生於香港島灣仔駱克道229號她來自基層家庭父母分別是上海移民和香港人未曾接受教育[12][13]她在家中排行第四有兩個姐姐一個哥哥和一個弟弟[14]小一至中七在嘉諾撒聖方濟各書院就讀[3]她在灣仔的板間房長大曾把碌架床上層用作書桌做功課生活條件不好後來隨著姐姐哥哥出來工作家裡環境改善於1978年在南豐新邨一筆過買了一個600多呎的三房單位
就讀香港大學期間鄭月娥曾以清華大學交流團副團長赴北京交流得到前清華大學黨委書記時任中國社會科學院領導袁永熙的接待
林鄭月娥在2017年參加行政長官選舉她在競選時指出其母親的堅毅是她的學習榜樣其母親除了照顧一家七口的起居飲食還要照顧中風的祖母後來又要照顧體弱多病的外祖母及中風的父親辛勞得很但無怨言她的父親耐性不好祖母不好相處有時還要聽親戚們的訴苦母親也是堅強地默默承受[14]
在學時期鄭月娥是品學兼優的模範生曾在校擔任總領袖生[12][15]她學業表面佳幾乎每次考試均取得第一名她曾因一次失手取得第四名而痛哭中學時期參加學校組織的義工探訪老人院孤兒院及盲童院等她的中學同學孫慧筠說我認識的Carrie外冷內熱她不大擅於交際凡事直話直說倒是個願意做事的人不管你找她幫甚麼忙只要不違反她的做人原則她都會盡力幫你而且她也是玩得之人不是只懂埋首書堆[16]
林鄭月娥曾在電台節目透露當年香港中學會考成績為3A5B1D其中物理取得D級成績[17][18]她在預科選讀文科及後考進香港大學社會科學學院成為家中第一個大學生她曾說過原本想入讀社工但後來選擇進修社會科學[13]於1980年取得社會科學學士學位於1982年在劍橋大學獲頒發一種名為本科畢業文憑的學位(undergraduate advanced diploma)與學士學位同樣是英國資歷架構FHEQ級別6的課程相當於學士的最後一年[19][20]
'''

70
main.py 100644
View File

@ -0,0 +1,70 @@
from dotenv import load_dotenv
load_dotenv()
import time
from openai import OpenAI
from datetime import datetime
import config, debug, prompt
DEBUG = True
'''
备注
目前使用ollama部署的qwen2.5:32b-instruct-q5_K_M,
如果输入字符串过长(大致超过1000个字符或1500token)会因上下文窗口过短导致提示词被遗忘
进而输出不合规定的结果
'''
llm = OpenAI(
base_url=config.LLM_BASE_URL,
api_key=config.API_KEY
)
def get_task() -> str:
# 从引擎中获取任务的接口
# 返回的类型应为字符串或None
raise NotImplementedError
def push_result(result):
# 将提取结果返回给引擎的接口
raise NotImplementedError
def entity_extract(input_text):
messages = [
{"role": "system", "content": prompt.ENTITY_EXTRACT},
{"role": "system", "content": f"今天的日期是:{str(datetime.today())}"},
{"role": "user", "content": f"{input_text}"}
]
timenow = time.time()
response = llm.chat.completions.create(
model=config.MODEL,
messages=messages,
temperature=0,
max_tokens=128_000
).choices[0].message.content
print(f"本次输出花费时间:{time.time() - timenow}")
return response
def run():
if DEBUG:
input_text = debug.input_text
else:
input_text = get_task()
if not input_text:
return
response = entity_extract(input_text)
if DEBUG:
print(response)
else:
push_result(response)
if __name__ == "__main__":
if DEBUG:
run()
exit()
while True:
run()
time.sleep(5)

20
prompt.py 100644
View File

@ -0,0 +1,20 @@
ENTITY_EXTRACT = '''
你是一个人物信息提取机器人你的任务是根据用户输入的一段文本从中抽取主要人物的信息并将其转换为标准json格式的输出返回给用户
输出的标准json键值定义如下
"full_name": 实体人物的姓名其中应包括人物的本名与别名值数据结构应为 list<str>
"date_of_birth": 实体人物的生日可提供近似值或精确值值数据结构应为 list<dict[type, value]>, type 可取值 "APPROXIMATELY" 对应近似生日 "EXACT" 准确生日
"occupation": 实体人物当下的职业值数据结构为 list<str>
"age": 实体人物的年龄此处的值应与"date_of_birth"的值相对应可提供近似值或精确值值数据结构应为 list<dict[type, value]>, type 可取值 "APPROXIMATELY" 对应近似年龄 "EXACT" 准确年龄如果后续系统提供了今天的日期则应返回准确年龄
"title": 实体人物的头衔值数据结构应为 list<str>
"university": 实体人物的毕业院校值数据结构应为 list<str>
"addresses": 实体人物的地址值数据结构应为 list<str>
"place_of_birth": 实体人物的出生地值数据结构应为 list<str>
"political_affiliations": 实体人物的政治立场值数据结构应为 list<str>
"entity_attr_flag": 实体人物的属性标记值数据结构应为 list<str>可取值为三种 CHN_pep(中国大陆政治人物)HKG_pep(中国香港政治人物)MAC_pep(中国澳门政治人物)如果不符合以上任意一种返回"others"
"jurisdiction": 司法管辖区国籍值数据结构应为 list<dict[name, iso_code]>如中国{"name":"中国", "iso_code": "CHN"}
"remarks": 备注值数据结构应为 list<str>
不允许返回除以上规定键值对以外的额外内容返回内容应严格包含所陈列的键值对
你只需返回要求的json禁止返回任何额外的分析与陈述同时禁止用任何额外字符包裹所返回的json
应尽可能多的利用用户输入的文本填充对应的键值对
'''

16
requirements.txt 100644
View File

@ -0,0 +1,16 @@
annotated-types==0.7.0
anyio==4.6.2.post1
certifi==2024.8.30
distro==1.9.0
h11==0.14.0
httpcore==1.0.7
httpx==0.27.2
idna==3.10
jiter==0.7.1
openai==1.55.0
pydantic==2.10.0
pydantic_core==2.27.0
python-dotenv==1.0.1
sniffio==1.3.1
tqdm==4.67.0
typing_extensions==4.12.2