LLM應(yīng)用實戰(zhàn): 給個公司簡稱,輸出公司全稱

1.背景

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

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

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

2.整體框架


其實,原理也非常簡單,由于本地數(shù)據(jù)庫缺乏公司的完整信息,但可以借助互聯(lián)網(wǎng)資源來搜索公司的相關(guān)信息,比如官網(wǎng)介紹、天眼查等來源,然后將檢索后的結(jié)果通過大模型自帶的推理能力輸出最終結(jié)果。

本文中使用的搜索引擎是duckduckgo_search(需要kexue上網(wǎng)),大模型調(diào)用使用的duckduckgo_search內(nèi)部集成的gpt-4o-mini(理論上只要能kexue上網(wǎng),即可免費使用gpt-4o-mini)

3. 效果展示


4.?全部源碼

由于調(diào)用檢索相對耗時,因此分為公司簡稱檢索和公司全稱提取兩個模塊

4.1公司簡稱檢索

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/公司簡稱檢索結(jié)果.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))

4.2公司全名提取


from duckduckgo_search import DDGS

import json

import time



PROMPT = """你是一個助手,你的任務(wù)是基于輸入的公司名簡稱以及搜索結(jié)果,分析并提取出公司名簡稱對應(yīng)的公司名全稱。要求如下:

1. "簡稱"是公司名簡稱,"搜索結(jié)果"是基于互聯(lián)網(wǎng)的搜索后的資源,需要根據(jù)"簡稱"和"搜索結(jié)果"進行分析,并輸出公司全稱,如果無法確認(rèn),請返回"無";

2.如果檢索結(jié)果不包含公司全稱,請基于你所學(xué)習(xí)的知識可以進一步判斷;

3.輸出結(jié)果只包含公司名的全稱信息,且只能包含一個,不需要輸出解釋信息;

4.輸入的公司名簡稱均是科技領(lǐng)域的知名公司,這點請注意;


示例:

簡稱:京東

搜索結(jié)果:

1.京東(中國1998年創(chuàng)立的自營式電商企業(yè))_百度百科\n京東(股票代碼:jd),中國自營式電商企業(yè),創(chuàng)始人劉強東初期擔(dān)任京東集團董事局主席兼首席執(zhí)行官,2021年9月,徐雷獲任集團總裁。京東旗下設(shè)有京東商城、京東金融、拍拍網(wǎng)、京東智能、o2o及海外事業(yè)部等。1998年6月18日,劉強東在 中關(guān)村成立京東公司。

2.京東集團 - 維基百科,自由的百科全書\n東集團. 京東集團 (NASDAQ: JD 、 港交所: 9618 、 港交所: 89618 (人民幣結(jié)算)),前稱 360buy 和 京東商城,由劉強東于1998年6月18日創(chuàng)立,是一家總部位于 北京 的 中國 電子商務(wù)公司,主要為 B2C 模式的購物網(wǎng)站 。. 2014年,京東集團在 美國 納斯達克證券交易 ...

3.京東集團股份有限公司 - 愛企查\n簡介: 京東集團股份有限公司(JD.com, Inc.)于2006年11月6日在在英屬維爾京群島注冊成立的公司,通過中國境內(nèi)的子公司和VIE開展經(jīng)營活動,公司總部位于北京。. 京東是專業(yè)的綜合性網(wǎng)上購物商城,是中國B2C市場最大的3C網(wǎng)購專業(yè)平臺,是中國電子商務(wù)領(lǐng)域最受 ...

輸出:京東集團股份有限公司


現(xiàn)在,請按照要求完成:

簡稱: {company_name}

搜索結(jié)果: {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/公司簡稱檢索結(jié)果.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/公司全稱提取結(jié)果.txt', results, json_flag=False)


if __name__ == '__main__':

????get_company_full_names()


5.總結(jié)

一句話足矣~

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

雖然需求比較簡單,且實現(xiàn)過程也比較簡單,但通過搜索引擎搜素以及大模型的各種奇技淫巧,相信可以完成更加復(fù)雜且效果驚艷的項目。

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

6.參考

1)?https://github.com/deedy5/duckduckgo_search.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容