LLM應用實戰: 給個公司簡稱,輸出公司全稱

mengrennwpu發表於2024-11-18

1.背景

qiang~本週在處理手頭專案工作的時候,遇到了一個問題,就是友方提供了一個公司名稱列表(量不小~,因此無法人工處理),且該公司名稱列表均為簡稱,需要與庫中的全稱做一個對映匹配。

看似簡單的一個需求,但傳統的技術手段貌似都無法派上用場,比如語義相似度,文字編輯距離等等。

因此本qiang花費了半天的時間思考並解決了該任務,遂將工作記錄如下,且本著開放共享,將核心原始碼進行公開,歡迎討論~

2.整體框架

其實,原理也非常簡單,由於本地資料庫缺乏公司的完整資訊,但可以藉助網際網路資源來搜尋公司的相關資訊,比如官網介紹、天眼查等來源,然後將檢索後的結果透過大模型自帶的推理能力輸出最終結果。

本文中使用的搜尋引擎是duckduckgo_search(需要kexue上網),大模型呼叫使用的duckduckgo_search內部整合的gpt-4o-mini(理論上只要能kexue上網,即可免費使用gpt-4o-mini

3. 效果展示

AutoX

深圳安途智行科技有限公司

Cosmose

翱覓苷(上海)資訊科技有限公司

Magic Data

北京晴數智慧科技有限公司

Minimax

名之夢(上海)科技有限公司

Momenta

北京初速度科技有限公司

Testin雲測

北京雲測資訊科技有限公司

一流科技

一流科技有限公司

三六零

三六零安全科技股份有限公司

東傑智慧

東傑智慧科技集團股份有限公司

東軟

東軟集團股份有限公司

中心通訊

中興通訊股份有限公司

中科創達

中科創達軟體股份有限公司

中科曙光

曙光資訊產業股份有限公司

中科視拓

中科視拓(北京)科技有限公司

中譯語通

中譯語通科技股份有限公司

九四智慧

廣州九四智慧科技有限公司

九章雲極

北京九章雲極科技有限公司

雲天勵飛

深圳雲天勵飛技術股份有限公司

雲徙科技

廣州雲徙科技有限公司

亞信科技

亞信科技控股有限公司

4. 全部原始碼

由於呼叫檢索相對耗時,因此分為公司簡稱檢索和公司全稱提取兩個模組

4.1公司簡稱檢索

LLM應用實戰: 給個公司簡稱,輸出公司全稱
from duckduckgo_search import DDGS
import json
import time

def save_datas(file_path, datas, json_flag=True, all_flag=False, with_indent=False, mode='w'):
    """儲存文字檔案"""
    with open(file_path, mode, encoding='utf-8') as f:
        if all_flag:
            if json_flag:
                f.write(json.dumps(datas, ensure_ascii=False, indent= 4 if with_indent else None))
            else:
                f.write(''.join(datas))
        else:
            for data in datas:
                if json_flag:
                    f.write(json.dumps(data, ensure_ascii=False) + '\n') 
                else:
                    f.write(data + '\n')


def search_companies(companies):
    results = []
    for company in companies:
        if '公司' in company:
            results.append({
                'company': company,
                'search_results': 'company'
            })
            continue
        text = f'{company} 公司名全稱'
        
        search_results = None
        while search_results is None:
            try:
                search_results = DDGS().text(text, max_results=10)
                if search_results: break
            except Exception as e:
                print('sleep 2s')
                time.sleep(2)
                continue
        results.append({
            'company': company,
            'search_results': search_results
        })
        time.sleep(2)
    save_datas('data/公司簡稱檢索結果.json', results)


def get_datas(file_path, json_flag=True, all_flag=False, mode='r'):
    """讀取文字檔案"""
    results = []
    
    with open(file_path, mode, encoding='utf-8') as f:
        for line in f.readlines():
            if json_flag:
                results.append(json.loads(line))
            else:
                results.append(line.strip())
        if all_flag:
            if json_flag:
                return json.loads(''.join(results))
            else:
                return '\n'.join(results)
        return results
    

if __name__ == '__main__':
    search_companies(get_datas('data/公司簡稱列表.txt', json_flag=False))
View Code

4.2公司全名提取

LLM應用實戰: 給個公司簡稱,輸出公司全稱
from duckduckgo_search import DDGS
import json
import time


PROMPT = """你是一個助手,你的任務是基於輸入的公司名簡稱以及搜尋結果,分析並提取出公司名簡稱對應的公司名全稱。要求如下:
1. "簡稱"是公司名簡稱,"搜尋結果"是基於網際網路的搜尋後的資源,需要根據"簡稱"和"搜尋結果"進行分析,並輸出公司全稱,如果無法確認,請返回"無";
2. 如果檢索結果不包含公司全稱,請基於你所學習的知識可以進一步判斷; 
3. 輸出結果只包含公司名的全稱資訊,且只能包含一個,不需要輸出解釋資訊;
4. 輸入的公司名簡稱均是科技領域的知名公司,這點請注意;

示例:
簡稱: 京東
搜尋結果:
1. 京東(中國1998年創立的自營式電商企業)_百度百科\n京東(股票程式碼:jd),中國自營式電商企業,創始人劉強東初期擔任京東集團董事局主席兼執行長,2021年9月,徐雷獲任集團總裁。京東旗下設有京東商城、京東金融、拍拍網、京東智慧、o2o及海外事業部等。1998年6月18日,劉強東在 中關村成立京東公司。
2. 京東集團 - 維基百科,自由的百科全書\n東集團. 京東集團 (NASDAQ: JD 、 港交所: 9618 、 港交所: 89618 (人民幣結算)),前稱 360buy 和 京東商城,由劉強東於1998年6月18日創立,是一家總部位於 北京 的 中國 電子商務公司,主要為 B2C 模式的購物網站 。. 2014年,京東集團在 美國 納斯達克證券交易 ...
3. 京東集團股份有限公司 - 愛企查\n簡介: 京東集團股份有限公司(JD.com, Inc.)於2006年11月6日在在英屬維爾京群島註冊成立的公司,透過中國境內的子公司和VIE開展經營活動,公司總部位於北京。. 京東是專業的綜合性網上購物商城,是中國B2C市場最大的3C網購專業平臺,是中國電子商務領域最受 ...
輸出: 京東集團股份有限公司

現在,請按照要求完成:
簡稱: {company_name}
搜尋結果: {search_results}
輸出: 
"""

def save_datas(file_path, datas, json_flag=True, all_flag=False, with_indent=False, mode='w'):
    """儲存文字檔案"""
    with open(file_path, mode, encoding='utf-8') as f:
        if all_flag:
            if json_flag:
                f.write(json.dumps(datas, ensure_ascii=False, indent= 4 if with_indent else None))
            else:
                f.write(''.join(datas))
        else:
            for data in datas:
                if json_flag:
                    f.write(json.dumps(data, ensure_ascii=False) + '\n') 
                else:
                    f.write(data + '\n')

def get_datas(file_path, json_flag=True, all_flag=False, mode='r'):
    """讀取文字檔案"""
    results = []
    
    with open(file_path, mode, encoding='utf-8') as f:
        for line in f.readlines():
            if json_flag:
                results.append(json.loads(line))
            else:
                results.append(line.strip())
        if all_flag:
            if json_flag:
                return json.loads(''.join(results))
            else:
                return '\n'.join(results)
        return results
    


def get_company_full_names():
    results = []
    for ele in get_datas('data/公司簡稱檢索結果.json'):
        company_name = ele['company']
        search_results = ele['search_results']
        if isinstance(search_results, str):
            results.append(f'{company_name}\t{company_name}')
            continue
        
        prompt = PROMPT.format(company_name=company_name, search_results=search_results)
        result = ''
        while result == '':
            try:
                result = DDGS().chat(prompt, model='gpt-4o-mini')
                if result.strip(): break
            except Exception as e:
                time.sleep(2)
                continue
        results.append(f'{company_name}\t{result}')
    save_datas('data/公司全稱提取結果.txt', results, json_flag=False)

if __name__ == '__main__':
    get_company_full_names()
View Code

5.總結

一句話足矣~

開發了一款基於公司簡稱補全公司全稱的工具,包括具體的框架、實現原理以及完整原始碼,滿滿誠意,提供給各位看官。歡迎轉發、訂閱~有問題可以私信或留言溝通!

雖然需求比較簡單,且實現過程也比較簡單,但透過搜尋引擎搜素以及大模型的各種奇技淫巧,相信可以完成更加複雜且效果驚豔的專案。

有興趣的客官可以進行溝通合作,感謝~

6.參考

(1) Duckduckgo_search: https://github.com/deedy5/duckduckgo_search.git

相關文章