From 6e66ccffd68980398de357b7622ec9f52a880608 Mon Sep 17 00:00:00 2001 From: S0beRr Date: Thu, 21 Nov 2024 02:15:07 +0000 Subject: [PATCH] first commit --- .gitignore | 2 ++ Dockerfile | 13 +++++++++ config.py | 3 +++ debug.py | 16 +++++++++++ main.py | 70 ++++++++++++++++++++++++++++++++++++++++++++++++ prompt.py | 20 ++++++++++++++ requirements.txt | 16 +++++++++++ 7 files changed, 140 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 config.py create mode 100644 debug.py create mode 100644 main.py create mode 100644 prompt.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4333778 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/venv/ +/__pycache__/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9f1f609 --- /dev/null +++ b/Dockerfile @@ -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"] \ No newline at end of file diff --git a/config.py b/config.py new file mode 100644 index 0000000..240a424 --- /dev/null +++ b/config.py @@ -0,0 +1,3 @@ +API_KEY = 'ollama' +MODEL = 'qwen2.5:32b-instruct-q5_K_M' +LLM_BASE_URL = 'http://localhost:11434/v1' \ No newline at end of file diff --git a/debug.py b/debug.py new file mode 100644 index 0000000..187e1ec --- /dev/null +++ b/debug.py @@ -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] +''' \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..ede9345 --- /dev/null +++ b/main.py @@ -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) \ No newline at end of file diff --git a/prompt.py b/prompt.py new file mode 100644 index 0000000..f2b76fb --- /dev/null +++ b/prompt.py @@ -0,0 +1,20 @@ +ENTITY_EXTRACT = ''' +你是一个人物信息提取机器人,你的任务是根据用户输入的一段文本,从中抽取主要人物的信息并将其转换为标准json格式的输出返回给用户。 +输出的标准json键值定义如下: +"full_name": 实体人物的姓名,其中应包括人物的本名与别名,值数据结构应为 list。 +"date_of_birth": 实体人物的生日,可提供近似值或精确值,值数据结构应为 list, type 可取值 "APPROXIMATELY" 对应近似生日 或 "EXACT" 准确生日。 +"occupation": 实体人物当下的职业,值数据结构为 list。 +"age": 实体人物的年龄,此处的值应与"date_of_birth"的值相对应,可提供近似值或精确值,值数据结构应为 list, type 可取值 "APPROXIMATELY" 对应近似年龄 或 "EXACT" 准确年龄,如果后续系统提供了今天的日期,则应返回准确年龄。 +"title": 实体人物的头衔,值数据结构应为 list。 +"university": 实体人物的毕业院校,值数据结构应为 list。 +"addresses": 实体人物的地址,值数据结构应为 list。 +"place_of_birth": 实体人物的出生地,值数据结构应为 list。 +"political_affiliations": 实体人物的政治立场,值数据结构应为 list。 +"entity_attr_flag": 实体人物的属性标记,值数据结构应为 list。可取值为三种,为 CHN_pep(中国大陆政治人物)、HKG_pep(中国香港政治人物)、MAC_pep(中国澳门政治人物),如果不符合以上任意一种,返回"others"。 +"jurisdiction": 司法管辖区(国籍),值数据结构应为 list。如中国,为{"name":"中国", "iso_code": "CHN"} +"remarks": 备注,值数据结构应为 list。 + +不允许返回除以上规定键值对以外的额外内容。返回内容应严格包含所陈列的键值对。 +你只需返回要求的json,禁止返回任何额外的分析与陈述。同时禁止用任何额外字符包裹所返回的json。 +应尽可能多的利用用户输入的文本填充对应的键值对。 +''' \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b66d0a8 --- /dev/null +++ b/requirements.txt @@ -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