天天看點

将GPT融入工作流的簡單方法

作者:ChatGPT掃地僧

一直在考慮如何讓GPT融入自身工作流的方法,但因為網頁版使用仍然有其便利性,而工作流的開發則需要時間。你往往會因為“緊急”而忽視了“重要”,而“重要”卻是更長期有效且效率更高的。是以,不得不将注意力從“緊急”轉到“重要”上來。

首先讓我們來思考,工作流中高頻且隻需一次對話便能夠完成的場景有哪些?

  • 會議紀要
  • 梳理任務清單
  • 郵件潤色
  • 文檔大綱生成
  • 文檔總結概述
  • 日程安排
  • 翻譯
  • 專業術語解釋
  • 文案創作
  • 文檔分類

嘗試将以上場景進行分類,可歸類為:

  • 文檔工作
    • 大綱生成
    • 總結概述
    • 會議紀要
    • 文檔分類
    • 郵件潤色
  • 任務管理
    • 梳理任務清單
    • 日程安排
  • 解析或創作
    • 文案創作
    • 翻譯
    • 專業術語解釋

假設以上工作都隻需要一次對話即可完成,那麼我們的py程式的輸入、處理過程和輸出則是:

輸入參數:工作場景+語料 處理步驟1:調用調試好的對應prompt 處理步驟2:将prompt+語料組合并發起對話請求 輸出:提取api傳回結果

利用Alfred工作流将上面的核心程式連接配接到你的使用場景中,比如:

  1. 通過快捷鍵觸發工作流,如 shift+command+P
  2. 擷取你滑鼠選中的文本→作為語料
  3. 輸入到py程式
  4. 輸出到剪貼闆

通過Alfred工作流來做的好處是,你可以在不同的工具中去調用,無論是Logseq還是Obsidian(當然Obsidian的TextGenerator插件也能完成),還是其他任何一個能記錄文字的地方都可以調用,并且使用的是同一套prompt。

以下是py程式的示例:

import os, sys
import openai
import json

# 運作環境初始化
os.environ["http_proxy"] = "http://127.0.0.1:1088" #修改為你的本地代理端口
os.environ["https_proxy"] = "http://127.0.0.1:1088" #修改為你的本地代理端口

openai.api_key = "你的openai key"

# 輸出标準化
def stdout_write(output_string: str) -> None:
	output_string = "..." if output_string == "" else output_string
	sys.stdout.write(output_string)

# 請求函數
def call_gpt_response(chat_template, chat_prompt, stream_msg=[]):
	# chat_template 模闆取自各個模版md檔案
	# chat_prompt 提問
	prompt_messages = []
	chat_prompt = chat_template + chat_prompt
	system_content = {"role": "system", "content": "你是任務規劃助手"}
	user_content_final = {"role": "user", "content": chat_prompt}
	prompt_messages.append(system_content)
	
	i = 1
	for msg in stream_msg:
		if i%2 == 1:
			user_content_previous = {"role": "user", "content": msg}
		else:
			user_content_previous = {"role": "system", "content": msg}
		prompt_messages.append(user_content_previous)
		i = i + 1

	prompt_messages.append(user_content_final)
	response = openai.ChatCompletion.create(
		# model = "gpt-3.5-turbo-0301",
		model = "gpt-4",
		messages = prompt_messages
	) # 修改你希望調用的模型

	res = json.loads(str(response))
	res_status = res['choices'][0]['finish_reason']
	res_content = res['choices'][0]['message']['content']
	
	if res_status == 'stop':
		return res_content
	else:
		print('Something wrong:{}'.format(res_status))
		return 999

if __name__ == '__main__':
	# 根據輸入參數,調用不同的模版
	template = "".join(sys.argv[1])
	input_selection = "".join(sys.argv[2])
	# 根據template參數讀取對應md檔案
	template_text = open("./templates/{}.md".format(template), 'r', encoding='utf-8').read()

	# 發起請求
	response = call_gpt_response(template_text, input_selection)
	response.replace('`', '').replace('\n\n', '\n')
	stdout_write(response)
           

工作流圖

其中執行py程式的算子示例(此處為了資料脫敏,用了~來表示,實際使用時建議用完整路徑):

cd ~/code/alfred-workflow

~/opt/anaconda3/envs/py37/bin/python ~/code/alfred-workflow/text_chat_main.py planner $1
           

每一個prompt最好都先在網頁端進行多次嘗試,等生成内容格式相對固定且内容品質穩定後再放入模闆進行使用,比如這個是用于任務規劃的prompt:

作為一個個人任務規劃管理師,你将為我對目标進行合理分解細化,并給出每個任務的預估工作量。你将為我分析任務之間的依賴關系,并将其以優先級區分,保證工作可有序高效進行。我是智慧城市産品經理和大資料技術經理,一般工作任務都跟産品管理與技術管理更為相關。

輸出規則如下:

{
- 整個清單以Markdown格式輸出
- 一級任務是無序清單,将```TODO```字眼,優先級(由高到低是#A、#B、#C),任務描述,依賴關系,預估工作量寫在一行,格式是:```- TODO [#A] 任務描述-依賴關系-預估工作量```
- 二級子任務是有序清單
}

以下是一個粗略的任務清單,請将其整理為規劃好的一二級任務清單,隻輸出清單即可:
           

個人星球正式更名:歪思大資料與AI研習社

希望小夥伴在此可結識到志同道合的人,分享研究心得,讨論最新的技術發展趨勢。

借此機會将2023年Q2的更新計劃颠覆一下下。因為AI的發展實在太快,即日起,不再過于在乎更新内容的精确性,而更注重瞬時性。個人立Flag,從一周兩更開始,并且完整内容将與個人公衆号同步釋出。

其他更零散、更偏向“不願意公開釋出”的内容會放在星球這邊。結合個人能力的傾向,我的更新會更偏向技術,當然也歡迎小夥伴跟我讨論各種應用及行業需求場景。

将GPT融入工作流的簡單方法

繼續閱讀