2 Commit-ok 389e977d31 ... f6b77b4c4d

Szerző SHA1 Üzenet Dátum
  jiayongqiang f6b77b4c4d Merge branch 'master' of http://git.yangzhiqiang.tech/jiayq/ai-tagging 1 napja
  jiayongqiang 5d536e9b7a 1 1 napja

+ 9 - 0
agent/.qwen/settings.json

@@ -0,0 +1,9 @@
+{
+  "permissions": {
+    "allow": [
+      "Read(c:\\Users\\86159\\Desktop/**)",
+      "Read(c:\\Users\\86159\\Desktop\\aitag_tag_info_202604131120.sql/**)"
+    ]
+  },
+  "$version": 3
+}

+ 7 - 0
agent/.qwen/settings.json.orig

@@ -0,0 +1,7 @@
+{
+  "permissions": {
+    "allow": [
+      "Read(c:\\Users\\86159\\Desktop/**)"
+    ]
+  }
+}

+ 5 - 1
agent/config.ini

@@ -2,15 +2,19 @@
 host = 10.192.72.11  
 port = 4321
 user = root
-password = admin
+password = KingBase@123
 database = ai_tagging
 schema=ai_tagging
+min=5
+max=20
 
 [llm]
 model = qwen3-32b
 temperature = 0.2
 base_url = http://172.16.40.16:20001/compatible-mode/v1
 api_key = 
+max_retries = 3
+timeout = 30
 
 [embedding]
 model = Qwen3-Embedding-8B

BIN
agent/data/24-all-result.xlsx


BIN
agent/data/24-all.xlsx


+ 1 - 0
agent/data/result.txt

@@ -0,0 +1 @@
+匹配数量: 234341, 总数量: 246834, 准确率: 94.94%

BIN
agent/data/样本数据打标结果-12w-终版.xlsx


BIN
agent/data/样本数据打标结果-明细.xlsx


+ 0 - 0
agent/data/正则表达式测试结果.txt


+ 1 - 1
agent/install.md

@@ -2,7 +2,7 @@
 pip3 install  --no-index   --find-links=file:///home/agent/dependices   ./dependices/*.whl
 
 # 2. 安装程序包,/home/agent/目录下放agent-xxx.whl
-pip3 install --no-index   --find-links=file:///home/agent/dist   agent
+pip3 install --no-index --no-deps  --find-links=file:///home/agent/dist   agent
 
 # 3. 设置配置文件
 vim ~/.bashrc

BIN
agent/logs/aitagging-app.2026-04-01_18-03-48_385635.log.zip


+ 1 - 1
agent/pyproject.toml

@@ -1,6 +1,6 @@
 [project]
 name = "agent"
-version = "0.1.6"
+version = "0.1.7"
 description = "Default template for PDM package"
 authors = [
     {name = "jiayongqiang", email = "15936285643@163.com"},

+ 3 - 0
agent/result.txt

@@ -0,0 +1,3 @@
+匹配数量: 9, 总数量: 10, 准确率: 90.00%
+海洋标签数量: 1, 匹配的海洋标签数量: 0, 海洋标签准确率: 0.00%
+非海洋标签数量: 9, 匹配的非海洋标签数量: 9, 非海洋标签准确率: 100.00%

+ 10 - 1
agent/src/agent/agent.py

@@ -14,6 +14,13 @@ base_url = config['llm']['base_url']
 api_key_env_var = config['llm']['api_key']
 temperature = config['llm']['temperature']
 model = config['llm']['model']
+# max_retries和timeout也从配置文件中读取,增加了默认值,以防止配置文件中缺失这两个参数导致的错误
+max_retries = config['llm']['max_retries']
+if max_retries is None:
+    max_retries = 3  # 默认重试次数
+timeout = config['llm']['timeout']
+if timeout is None:
+    timeout = 30  # 默认超时时间(秒)
 
 llm = init_chat_model(
     model_provider="openai", 
@@ -21,7 +28,9 @@ llm = init_chat_model(
     api_key=api_key_env_var,
     base_url=base_url,
     temperature= temperature,
-    extra_body={"enable_thinking": False}
+    extra_body={"enable_thinking": False},
+    max_retries=max_retries,
+    timeout=timeout
 )
 
 class Lable(BaseModel):

+ 25 - 6
agent/src/agent/api_outter.py

@@ -34,6 +34,7 @@ class TaggingRequest(BaseModel):
     phrase: str = Field(..., description="需要打标签的文本")
     tag_category_id: Optional[str] = Field(None, description="指定标签类别ID,默认为空表示不指定")
     esb_seq_no: Optional[str] = Field(None,description="ESB流水号")
+    instucde:Optional[str] = Field(None, description="法人行社代码")
 
 async def execute_reg(log_id:str,tag_category_id:str,phrase: str)-> list:
     sql = f"""select 
@@ -106,19 +107,25 @@ def fail_tagging(id:str):
             (TAGGING_STATE.FAIL.value,  datetime.now(), id)
         )
 
-def start_tagging(id:str):
+def start_tagging(id:str, instucde: Optional[str] = None):
+    is_marine = 0
+    if instucde:
+        rows = dao.query("select tag_type from aitag_org_whitelist where org_code = %s", (instucde,))
+        if rows and len(rows) == 1:
+            logger.info(f"机构{instucde}在白名单中")
+            is_marine = 1 if rows[0][0] == 'marine' else 0
     dao.execute(
-            """UPDATE aitag_tag_log SET state = %s,  ai_result_starttime = %s WHERE id = %s""",
-            (TAGGING_STATE.BEGIN.value, datetime.now(),  id)
+            """UPDATE aitag_tag_log SET state = %s, is_marine = %s, ai_result_starttime = %s WHERE id = %s""",
+            (TAGGING_STATE.BEGIN.value, is_marine, datetime.now(),  id)
         )
 
 
-async def run_ai_pipeline(log_id: str, tag_category_id: str, phrase: str):
+async def run_ai_pipeline(log_id: str, tag_category_id: str, phrase: str, instucde: Optional[str] = None):
     try:
         async with background_semaphore:
             logger.info(f"开始打标:{log_id}, {phrase}")
             # step0: 开始打标
-            start_tagging(log_id)
+            start_tagging(log_id, instucde)
             # step1: 正则过滤
             result = await execute_reg(log_id,tag_category_id,phrase)
             # step2: 向量检索
@@ -140,6 +147,17 @@ async def run_ai_pipeline(log_id: str, tag_category_id: str, phrase: str):
         logger.error(f"[{log_id}] Pipeline failed: {e}")
         fail_tagging(log_id)
 
+async def batch_run_async():
+    # 一次查询1000条 状态为0(处理中)的记录,调用打标流程,直到没有满足条件的记录
+    while True:
+        records = dao.query("""SELECT id, business_attr, phrase FROM aitag_tag_log WHERE state = 0 and is_delete = 0 limit 1000""")
+        if not records:
+            logger.info("No more records to process. Exiting.")
+            break
+        for record in records:
+            log_id = record[0]
+            phrase = record[2]
+            run_ai_pipeline(log_id, None, phrase)
 
 # 0:请求已接收;1:打标完成; 2:客户经理已经确认;3,结果已推送; 
 # 4:开始打标, 5:打标失败
@@ -153,7 +171,8 @@ async def ai_tagging(request: TaggingRequest,background_tasks: BackgroundTasks):
         run_ai_pipeline,  # 后台任务函数
         log_id=id,
         tag_category_id=request.tag_category_id,    
-        phrase=request.phrase
+        phrase=request.phrase,
+        instucde=request.instucde
     )
     logger.info(f"Started background task for log_id: {id}")
     return {

+ 13 - 3
agent/src/agent/core/dao.py

@@ -13,9 +13,15 @@ user = config['database']['user']
 password = config['database']['password']
 database = config['database']['database']
 schema = config['database']['schema']
+min = config['database']['min']
+if min is None:
+    min = 5  # 默认最小连接数
+max = config['database']['max']
+if max is None:
+    max = 20  # 默认最大连接数
 
 pool = psycopg2.pool.SimpleConnectionPool(
-    20, 50,
+    min, max,
     host=host,
     port=port,
     database=database,
@@ -30,9 +36,13 @@ def get_db_connection():
     try:
         conn = pool.getconn()
         yield conn
-    finally:
+    except Exception:
         if conn:
-            pool.putconn(conn)
+            conn.rollback()          # ← 清理未提交事务
+            pool.putconn(conn, close=True)  # ← 丢弃可能损坏的连接
+        raise
+    else:
+        pool.putconn(conn)
 
 def query(sql, params=None):
     with get_db_connection() as conn:

+ 1 - 1
agent/src/agent/core/es.py

@@ -6,7 +6,7 @@ TOP_K = int(config['app']['top_k'])
 
 url = config['es']['url']
 DIMS = int(config['embedding']['default_dims'])
-DIMS = 512
+
 
 RRF_CONST:int = 60
 

+ 15 - 1
agent/src/agent/main.py

@@ -3,6 +3,9 @@ from agent.api_outter import router as outter_router
 from agent.api_inner import router as inner_router  
 from agent.logger import logger
 import uvicorn
+from contextlib import asynccontextmanager
+from agent.api_outter import batch_run_async
+
 logger.info("ai-tagging starting!")
 
 api_router = APIRouter()
@@ -14,10 +17,21 @@ config = get_config_path()
 # 如果没有配置port,默认使用9876
 port = int(config['app'].get('port', 9876))
 
+# 1. 定义 lifespan 事件
+@asynccontextmanager
+async def lifespan(app: FastAPI):
+    # --- 启动时执行 ---
+    logger.info("执行中断的跑批任务...")
+    # 读取状态为0的所有任务,调用api_outter.py中的
+    batch_run_async()
+    # --- 关闭时执行 ---
+    logger.info("服务正在关闭,清理资源...")
+
 app = FastAPI(
     title="AI-TAGGING",
     description="智能打标系统", 
-    version="0.1.0"
+    version="0.1.0",
+    lifespan=None
 )
 app.include_router(api_router, prefix="/api/aitag")
 print('API routes initialized')

+ 55 - 0
agent/tests/test_24w_hebing.py

@@ -0,0 +1,55 @@
+from openpyxl import load_workbook, Workbook
+from agent.core.dao import query
+import json
+
+wb = load_workbook('./data/24-all.xlsx')
+ws = wb.active
+
+
+nwb = Workbook()
+nws = nwb.active
+nws.title = "员工信息表"
+headers = ["职业", "投向", "用途", "是否海洋标签", "result", "我方整体结果","我方具体结果标签1","我方具体结果标签1的状态","我方具体结果标签2","我方具体结果标签2的状态"]
+nws.append(headers)
+index = 0
+for row in ws.iter_rows(min_row=2, values_only=True):
+    index += 1
+    print(f"-------------------------{index}-------------------------")
+    data = []
+    zhiye = row[1] if row[1] is not None else ""
+    data.append(zhiye)
+    touxiang = row[2] if row[2] is not None else ""
+    data.append(touxiang)
+    yongtu = row[3] if row[3] is not None else ""
+    data.append(yongtu)
+    phrase = f"职业:{zhiye}; 投向:{touxiang}; 用途:{yongtu}"
+    is_seatab = row[4] if row[4] is not None else ""
+    is_seatab = True if is_seatab == "是" else False
+    data.append(is_seatab)
+    try:
+        r = query("SELECT result FROM ai_tagging.ai_tagging.aitag_tag_log WHERE phrase = %s", (phrase,))
+        if r and len(r) > 0:
+            result = r[0][0]
+            data.append(json.dumps(result,ensure_ascii=False))
+            rs = result
+            if rs is not None:
+                if len(rs) == 2:
+                    data.append(rs[0]["passr"] or rs[1]["passr"])
+                    data.append(rs[0]["tag_name"])
+                    data.append(rs[0]["passr"])
+                    data.append(rs[1]["tag_name"])
+                    data.append(rs[1]["passr"])
+                elif len(rs) == 1:
+                    data.append(rs[0]["passr"])
+                    data.append(rs[0]["tag_name"])
+                    data.append(rs[0]["passr"])
+                    data.append("")
+                    data.append("")
+        else:
+            result = None
+    except Exception as e:
+            print(f"Error processing row {index}: {e}")
+            continue
+    nws.append(data)
+   
+nwb.save('./data/24-all-result.xlsx')

+ 50 - 0
agent/tests/test_acct_24w.py

@@ -0,0 +1,50 @@
+from openpyxl import load_workbook
+from agent.core.dao import query
+
+wb = load_workbook('./data/24-all.xlsx')
+ws = wb.active
+
+match_count = 0
+total_count = 0
+a_seatab_count = 0
+a_notseatab_count = 0
+match_seatab_count = 0
+match_notseatab_count = 0
+for row in ws.iter_rows(min_row=2, values_only=True):
+    print("-------------------------")
+    
+    zhiye = row[1] if row[1] is not None else ""
+    touxiang = row[2] if row[2] is not None else ""
+    yongtu = row[3] if row[3] is not None else ""
+    phrase = f"职业:{zhiye}; 投向:{touxiang}; 用途:{yongtu}"
+    is_seatab = row[4] if row[4] is not None else ""
+    is_seatab = True if is_seatab == "是" else False
+    if is_seatab:
+        a_seatab_count += 1
+    else:
+        a_notseatab_count += 1
+    r = query("SELECT LENGTH(reg_result) FROM ai_tagging.ai_tagging.aitag_tag_log WHERE phrase = %s", (phrase,))
+    print(phrase)
+    print(r)
+    if r and len(r) > 0:
+        reg_result = True if r[0][0] > 2 else False
+    else:
+        reg_result = False
+    
+    if reg_result == is_seatab:
+        if is_seatab:
+            match_seatab_count += 1
+        else:
+            match_notseatab_count += 1
+    print(reg_result)
+    total_count += 1
+    if reg_result == is_seatab:
+        match_count += 1
+
+# 将结果写入文件,防止中文乱码
+with open('./result.txt','w',encoding='utf-8') as f:
+    f.write(f"粗筛统计结果:\n")
+    f.write(f"\n总数量: {total_count},匹配数量: {match_count}, 准确率: {match_count/total_count:.2%}")
+    f.write(f"\n海洋标签数量: {a_seatab_count}, 匹配的海洋标签数量: {match_seatab_count}, 海洋标签准确率: {match_seatab_count/a_seatab_count:.2%}")
+    f.write(f"\n非海洋标签数量: {a_notseatab_count}, 匹配的非海洋标签数量: {match_notseatab_count}, 非海洋标签准确率: {match_notseatab_count/a_notseatab_count:.2%}")
+    

+ 1 - 1
agent/tests/test_query.py

@@ -1,4 +1,4 @@
 import requests
 
-result = requests.get("http://10.192.72.13:9876/api/aitag/v1/query?business_attr=test_attr")
+result = requests.get("http://10.192.72.13:9876/api/aitag/v1/query?business_attr=test_attr3")
 print(result.text)

+ 6 - 2
agent/tests/test_reg.py

@@ -1,7 +1,7 @@
 import re
 
 regstr = """
-^(?!.*(淡水|池塘|内河|江河|湖泊|水库|观赏鱼|锦鲤|龙鱼|花鸟)).*?(?:海.{0,100}(养殖|鲍|参|虾|蟹|贝|蚝|蛎|蛤|扇贝|鲍鱼|海参|对虾|虾|贻贝|牡蛎|蛏|螺|紫菜|海带)|(养殖|鲍|参|虾|蟹|贝|蚝|蛎|蛤|扇贝|鲍鱼|海参|对虾|蟹|虾|贻贝|牡蛎|蛏|螺|紫菜|海带).{0,100}海)
+^(?!.*(贷款|借款|融资|采购|销售|建设|工程|制造|生产|养殖|捕捞|贸易|物流|运输|旅游|酒店|餐饮|房地产|个人消费)).*(海洋.{0,100}(协会|学会|商会|联盟|联合会|促进会|研究会|俱乐部|公益组织|基金会|社会组织|非营利组织|NGO)|(协会|学会|商会|联盟|联合会|促进会|研究会|俱乐部|公益组织|基金会|社会组织|非营利组织|NGO).{0,100}海洋)
 """
 
 test_cases = [
@@ -10,7 +10,8 @@ test_cases = [
     "船舶防腐",        
     "职业:水产养殖人员 投向:内陆养殖 用途:养殖鲍鱼", 
     "材料",           
-    "医疗防护服",      
+    "医疗防护服",
+    "职业:艺术从业者;投向:环保投资;用途:海洋垃圾清理公益组织"      
 ]
 
 pattern = re.compile(regstr, re.VERBOSE)
@@ -18,3 +19,6 @@ pattern = re.compile(regstr, re.VERBOSE)
 for t in test_cases:
     print(f"{t!r}: {'✓' if pattern.match(t) else '✗'}")
 
+a = False
+b = False
+print(a == b)

+ 38 - 0
agent/tests/test_reg_seg.py

@@ -0,0 +1,38 @@
+from openpyxl import load_workbook
+from agent.core.dao import query
+import re
+
+sql = f"""select 
+                tti.id,
+                tti.reg
+                from aitag_tag_info tti left join aitag_tag_category  ttc 
+                on tti.category_id = ttc.id 
+                where ttc.is_delete=0 and tti.is_delete=0  and tti.state = 0 and tti.tag_level = ttc.visibility_level
+                """    
+labels = query(sql)
+print(labels)
+
+def reg_match(text):
+    # 循环调用reg匹配phrase,匹配成功则返回标签id
+    result = []
+    with open('./data/正则表达式测试结果.txt', 'w', encoding='utf-8') as f:
+        for label in labels:
+            reg = label[1] 
+            if reg is not None:
+                print(f"---------{label[0]}----------")
+                print(reg)
+                # try:
+                pattern = re.compile(reg, re.VERBOSE)
+                if pattern.match(text):
+                    result.append(label[0])
+                # except re.error as e:
+                #     print(f"Error compiling regex for label {label[0]}: {e}")
+                #     f.write(f"Error compiling regex for label {label[0]}: {e}\n")
+    return result
+
+r = reg_match('海水养殖')
+print(r)
+
+# wb = load_workbook('./data/样本数据打标结果-12w-终版.xlsx')
+# ws = wb.active
+# for row in ws.iter_rows(min_row=2, values_only=True):

+ 4 - 4
agent/tests/test_sync_category.py

@@ -1,10 +1,10 @@
 import requests
 
-# res = requests.post("http://10.192.72.13:9876/api/aitag/admin/v1/synchronize_category", json={
-#     "category_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
-# })
-res = requests.post("http://localhost:9876/api/aitag/admin/v1/synchronize_category", json={
+res = requests.post("http://10.192.72.13:9876/api/aitag/admin/v1/synchronize_category", json={
     "category_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
 })
+# res = requests.post("http://localhost:9876/api/aitag/admin/v1/synchronize_category", json={
+#     "category_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
+# })
 print(res.text)
 

+ 1 - 1
agent/tests/test_tagging.py

@@ -8,7 +8,7 @@ res = requests.post("http://10.192.72.13:9876/api/aitag/v1/tagging", json={
     # "timestamp": 1234567890,
     # "sign": "test_sign",
     "esb_seq_no":"abc",
-    "business_attr": "test_attr",
+    "business_attr": "test_attr3",
     "phrase": "职业:水产养殖人员 投向:内陆养殖 用途:养殖鲍鱼"
 })
 

+ 8 - 3
agent/tests/test_tagging_24w.py

@@ -4,14 +4,19 @@ from openpyxl import load_workbook
 
 wb = load_workbook('./data/24-all.xlsx')
 ws = wb.active
+idx = 0
 for row in ws.iter_rows(min_row=2, values_only=True):
+    idx += 1
+    concat_no = row[0] if row[0] is not None else ""
     zhiye = row[1] if row[1] is not None else ""
     touxiang = row[2] if row[2] is not None else ""
     yongtu = row[3] if row[3] is not None else ""
+    is_sea = row[4] if row[4] is not None else ""
+    is_sea = "1" if is_sea == '是' else "0"
     phrase = f"职业:{zhiye}; 投向:{touxiang}; 用途:{yongtu}"
-    print(phrase)
+    print(f"{idx}: {concat_no} - {phrase}" )
     requests.post("http://10.192.72.13:9876/api/aitag/v1/tagging", json={
-        "esb_seq_no": uuid.uuid4().hex,
-        "business_attr": uuid.uuid4().hex,
+        "esb_seq_no": is_sea,
+        "business_attr": concat_no,
         "phrase": phrase
     })

+ 37 - 0
agent/update.sql

@@ -0,0 +1,37 @@
+-- 添加是否是海洋标签字段
+ALTER TABLE ai_tagging.aitag_tag_log ADD is_marine bit DEFAULT 0;
+COMMENT ON COLUMN ai_tagging.aitag_tag_log.is_marine IS '是否是海洋标签,0:否,1:是';
+
+-- 创建行社白名单表
+CREATE TABLE ai_tagging.aitag_org_whitelist (
+	id varchar(100),
+	org_name varchar(100),
+	org_code varchar(100),
+	tag_type varchar(100),
+	CONSTRAINT aitag_org_whitelist_PK PRIMARY KEY (id)
+);
+COMMENT ON TABLE ai_tagging.aitag_org_whitelist IS '行社白名单表';
+COMMENT ON COLUMN ai_tagging.aitag_org_whitelist.tag_type IS '标签类型,marine:海洋标签';
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('1', '福建福州农村商业银行股份有限公司', '901020300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('2', '福建长乐农村商业银行股份有限公司', '901060300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('3', '福建福清汇通农村商业银行股份有限公司', '901070300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('4', '福建平潭农村商业银行股份有限公司', '901080300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('5', '福建连江农村商业银行股份有限公司', '901090300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('6', '罗源县农村信用合作联社', '901100300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('7', '厦门农村商业银行股份有限公司', '902010200', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('8', '福建莆田农村商业银行股份有限公司', '904020300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('9', '福建宁德农村商业银行股份有限公司', '906020300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('10', '福鼎市农村信用合作联社', '906030300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('11', '霞浦县农村信用合作联社', '906040300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('12', '福安市农村信用合作联社', '906050300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('13', '泉州农村商业银行股份有限公司', '907020300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('14', '惠安县农村信用合作联社', '907030300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('15', '福建晋江农村商业银行股份有限公司', '907040300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('16', '福建石狮农村商业银行股份有限公司', '907060300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('17', '福建南安农村商业银行股份有限公司', '907070300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('18', '福建漳州农村商业银行股份有限公司', '908020300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('19', '福建龙海农村商业银行股份有限公司', '908030300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('20', '云霄县农村信用合作联社', '908040300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('21', '福建漳浦农村商业银行股份有限公司', '908050300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('22', '诏安县农村信用合作联社', '908060300', 'marine');
+INSERT INTO ai_tagging.aitag_org_whitelist (id, org_name, org_code, tag_type) VALUES ('23', '东山县农村信用合作联社', '908080300', 'marine');