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 = '''
林鄭月娥,大紫荊勳賢,GBS,JP(英語:Carrie Lam Cheng Yuet-ngor;1957年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