当前位置: 首页 > news >正文

LLM_入门指南(零基础搭建大模型)

        本文主要介绍大模型的prompt,并且给出实战教程。即使零基础也可以实现大模型的搭建。

内容:初级阶段的修炼心法,帮助凝聚和提升内力,为后续修炼打下基础。

1、prompt

1.1含义和作用

        prompt就是提示工程的意思。在大型语言模型中,"prompt"(提示)指的是用户提供给模型的输入文本或指令,用来指导模型生成相应的输出。Prompt在与模型交互时起着至关重要的作用,它影响着模型的理解、回答的准确性和内容的创造性。以下是prompt在大模型中的主要含义和作用:

        a. 指导模型生成:Prompt提供了模型生成回复或输出所需的初始信息和方向。它可以包含问题、指令、关键词或上下文信息,帮助模型理解用户的意图和需要,并基于此进行相应的生成。

        b. 上下文理解:通过prompt,模型能够了解当前对话或任务的上下文。这对于确保模型生成与用户期望相关和连贯的回复至关重要,特别是在长期交互或多轮对话中。

        c.回答准确性:一个清晰和详细的prompt通常会导致更准确的回答。如果prompt描述清楚用户的问题或需求,模型就能更容易地提供符合预期的信息或解决方案。

        d.生成多样性:尽管prompt为模型提供了指导,但它并不限制模型的创造性和输出的多样性。合适的prompt可以在保持准确性的同时,激发模型产生新颖或非显而易见的解答。

        e. 任务定向:在一些应用场景中,prompt可以具体指定模型需要执行的任务或生成的类型,如回答问题、提供建议、描述情景等。这种指导有助于确保模型输出与特定任务或应用的需求相符。

        f. 语言风格和格式:通过prompt,用户可以设定期望的语言风格、回答的结构或特定的信息格式。这对于确保模型输出的整体质量和用户体验至关重要。

        总之,prompt在大型语言模型中充当了用户与模型之间交互的桥梁和指南,对于影响模型输出的准确性、相关性和多样性起着关键作用。有效地构建和使用prompt可以显著提高模型的实用性和响应能力。

1.2原则

        在处理大型语言模型中的prompt时,有几个原则是通常被考虑和遵循的:

        a.清晰和简洁的指导:prompt应该明确表达用户的需求或者问题,避免模糊或多义的描述,以确保模型能够理解并提供相关和准确的回答。

        b. 上下文的引导:如果问题或需求涉及到特定的背景或上下文,prompt应该包含必要的信息来帮助模型理解,比如相关的关键词或相关信息。

        c. 具体的指令:prompt中应包含具体的指令或问题,以便模型知道用户期望的输出类型和格式。例如,询问一个城市的旅游景点时,可以明确指定需要景点名称、活动建议或交通信息等。

        d.避免过度指导:虽然提供一些上下文和指导是有益的,但避免过度指导或提供过多细节,以免限制模型的创造性和回答的多样性。

        e. 语言简洁明了:使用清晰、简洁和自然的语言编写prompt,以便模型能够轻松理解和处理。

        f.测试和调整:在实际应用中,对prompt进行测试和调整是很重要的,以确保模型能够按预期工作,并且能够有效地处理各种输入。

        这些原则有助于确保大型语言模型能够在与用户的交互中表现出高效、准确和有创意的特性。

        总之:prompt就是一个起点,给大模型一个提示、引导和规范的作用。

1.3使用技巧

        a.分隔符

        eg:给出一段话并要求 GPT 进行总结,在该示例中我们使用 ``` 来作为分隔符。

from tool import get_completion
text = """您应该提供尽可能清晰、具体的指示,以表达您希望模型执行的任务。这将引导模型朝向所
需的输出,并降低收到无关或不正确响应的可能性。不要将写清晰的提示词与写简短的提示词混淆。在
许多情况下,更长的提示词可以为模型提供更多的清晰度和上下文信息,从而导致更详细和相关的输出。
""" # 需要总结的文本内容
prompt = f"""把用三个反引号括起来的文本总结成一句话。```{text}```""" # 指令内容,使用 ``` 来分隔指令和待总结的内容
response = get_completion(prompt)
print(response)
# 为了获得所需的输出,您应该提供清晰、具体的指示,避免与简短的提示词混淆,并使用更长的提示
词来提供更多的清晰度和上下文信息。

          b.结构化输出

        eg:生成三本书的标题、作者和类别,并以 JSON 的格式返回,为便于解析,我们指定了 Json 的键: book_id、title、author、genre。

prompt = f"""请生成包括书名、作者和类别的虚构的、非真实存在的中文书籍清单,并以 JSON 格式
提供,其中包含以下键:book_id、title、author、genre。"""
response = get_completion(prompt)
print(response)
[
{ "book_id": 1, "title": "幻境之夜", "author": "李梦飞", "genre": "奇幻小说"
},
... ]

        c.参考示例

         Zero-Shot提示:模型只根据任务的描述生成响应,不需要任何示例。

         One-Shot提示:只提供一个例子。

        Few-Shot提示:提供几个例子。在提示中的作用是通过少量样本引导模型对特定任务进行学习和执行,例如通过提供少量风格或主题示例,引导模型产出具有相似风格或主题的创作。

        d.让模型充当角色

        示例:请以莎士比亚戏剧中的哈姆雷特的身份解释“生存还是毁灭,这是一个问题”。这个示例要求模型以莎士比亚戏剧《哈姆雷特》中主人公的角色来解释著名的“生存还是毁灭”的问题,以展示模型在不同角色中的表现能力和语境理解能力。

2、模型实战

        项目任务(三大业务场景):

        1.文本分类

        2.文本信息抽取

        3.文本匹配

        大模型选择:ChatGLM-6B

        采用方法:基于Few-Shot+Zero-Shot以及Instrunction的思想,设计prompt, 进而应用ChatGLM-6B模型完成相应的任务

2.1 准备工作

        a.我们运用python环境来执行大模型,所以首先需要下载python,(建议用anaconda)

        b.下载ChatGLM-6B模型模型,链接如下:

                https://github.com/THUDM/ChatGLM-6B?tab=readme-ov-file

                README中介绍了ChatGLM-6B模型和硬件需求。

量化等级最低 GPU 显存(推理)最低 GPU 显存(高效参数微调)
FP16(无量化)13 GB14 GB
INT88 GB9 GB
INT46 GB7 GB

        c.在你的anaconda中安装需要的依赖。在前面github中下载的包中,它其实把所有需要的依赖都放在了requirements.txt中,直接输入:

        pip install -r requirements.txt

        如果下载速度很慢,加上清华镜像

        pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

        其中 transformers 库版本推荐为 4.27.1,但理论上不低于 4.23.1 即可。

        此外,如果需要在 cpu 上运行量化后的模型,还需要安装 gcc 与 openmp。多数 Linux 发行版默认已安装。Windows 测试环境 gcc 版本为 TDM-GCC 10.3.0, Linux 为 gcc 11.3.0

        d.从本地加载模型:

        以上代码会由 transformers 自动下载模型实现和参数。完整的模型实现可以在 Hugging Face Hub。如果你的网络环境较差,下载模型参数可能会花费较长时间甚至失败。此时可以先将模型下载到本地,然后从本地加载。

        从 Hugging Face Hub 下载模型需要先安装Git LFS,然后运行

git clone https://huggingface.co/THUDM/chatglm-6b

如果你从 Hugging Face Hub 上下载 checkpoint 的速度较慢,可以只下载模型实现

GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm-6b

        然后从这里手动下载模型参数文件,并将下载的文件替换到本地的 chatglm-6b 目录下。

        将模型下载到本地之后,将以上代码中的 THUDM/chatglm-6b 替换为你本地的 chatglm-6b 文件夹的路径,即可从本地加载模型。

        MAC注意

        Mac直接加载量化后的模型出现提示 `clang: error: unsupported option '-fopenmp'

        这是由于Mac由于本身缺乏omp导致的,此时可运行但是单核。需要单独安装 openmp 依赖,即可在Mac下使用OMP:

# 参考`https://mac.r-project.org/openmp/`
## 假设: gcc(clang)是14.x版本,其他版本见R-Project提供的表格
curl -O https://mac.r-project.org/openmp/openmp-14.0.6-darwin20-Release.tar.gz
sudo tar fvxz openmp-14.0.6-darwin20-Release.tar.gz -C /

此时会安装下面几个文件:/usr/local/lib/libomp.dylib/usr/local/include/ompt.h/usr/local/include/omp.h/usr/local/include/omp-tools.h

注意:如果你之前运行ChatGLM项目失败过,最好清一下Huggingface的缓存,i.e. 默认下是 rm -rf ${HOME}/.cache/huggingface/modules/transformers_modules/chatglm-6b-int4。由于使用了rm命令,请明确知道自己在删除什么。

        这是官方给的解决方案,我没成功。我是在代码上加入如下:

import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

        防止了mac执行报错。

2.2 文本分类

        我们的目的是期望模型能够帮助我们识别出这4段话中,每一句话描述的是一个什么类型的报告。

sentences = ["今天,央行决定通过降低利率来刺激经济增长。这一决策预计会影响到贷款利率,并在接下来的几个季度对金融市场产生深远影响。","ABC公司今日宣布,他们已成功收购了XYZ公司的股权。这一重要的收购交易有助于ABC公司扩展业务范围,增强市场竞争力。据悉,这次收购将进一步巩固ABC公司在行业中的地位,并为未来的业务发展提供更广阔的空间。详细信息请参阅公司官方网站公告栏。","公司资产负债表显示,公司偿债能力强劲,现金流充足,为未来投资和扩张提供了坚实的财务基础。",

        对于大模型来讲,prompt 的设计非常重要,一个 明确 的 prompt 能够帮助我们更好从大模型中获得我们想要的结果。

在该任务的 prompt 设计中,我们主要考虑 2 点:

        1、需要向模型解释什么叫作「文本分类任务」

        2、需要让模型按照我们指定的格式输出

        2.2.1导入包
"""
利用 LLM 进行文本分类任务。
"""
from rich import print
from rich.console import Console
from transformers import AutoTokenizer, AutoModel
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
        2.2.2 定义init_prompts函数
# 提供所有类别以及每个类别下的样例
class_examples ={
'新闻报道':'今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整,以适应市场的不确定性。',
'财务报告':'本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。',
'公司公告':'本公司高兴地宣布成功完成最新一轮并购交易,收购了一家在人工智能领域领先的公司。这一战略举措将有助于扩大我们的业务领域,提高市场竞争力',
'分析师报告':'最新的行业分析报告指出,科技公司的创新将成为未来增长的主要推动力。云计算、人工智能和数字化转型被认为是引领行业发展的关键因素,投资者应关注这些趋势'}# 定义init_prompts函数
definit_prompts():
'''这里是对函数的功能进行注释,方便他人理解:该函数的目的是初始化前置prompt,便于模型做Few-shot:return: dict字典'''class_list =list(class_examples.keys())
print(f'分类的类别数:{class_list}')pre_history =[
(f'现在你是一个文本分类器,你需要按照要求将我给你的句子分类到:{class_list}类别中。',
f'好的。')
]
# 遍历给的示例样本
for _type, example in class_examples.items():
# print(f'键--》{_type}')
# print(f'值--》{example}')pre_history.append((f'"{example}"是{class_list}里的什么类别', _type))# print(f'pre_history--》{pre_history}')
return{"class_list":class_list,"pre_history":pre_history}

        a.提供一个Few-shot的样例,标注每个类别对应的话

        b.将类别存储到class_list中

        c.在样本提供之前给予一个prompt。即告诉模型。你是个文本分类器,要具体做什么?并给予一个答案(以逗号分隔)。(相当于一个有监督的训练)

        d.遍历给的示例样本,添加到pre_history

        e.返回一个字典。

        打印的结果如下:

分类的类别数:['新闻报道','财务报告','公司公告','分析师报告']
键--》新闻报道
值--》今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整,以适应市场的不确定性。
键--》财务报告
值--》本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。
键--》公司公告
值--》本公司高兴地宣布成功完成最新一轮并购交易,收购了一家在人工智能领域领先的公司。这一战略举措将有助于扩大我们的业务领域,提高市场竞争力
键--》分析师报告
值--》最新的行业分析报告指出,科技公司的创新将成为未来增长的主要推动力。云计算、人工智能和数字化转型被认为是引领行业发展的关键因素,投资者应关注这些趋势
pre_history--》[("现在你是一个文本分类器,你需要按照要求将我给你的句子分类到:['新闻报道', '财务报告', '公司公告', '分析师报告']类别中。",'好的。'),('"今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整,以适应市场的不确定性。"是[\'新闻报道\', \'财务报告\', \'公司公告\', \'分析师报告\']里的什么类别','新闻报道'),('"本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。"是[\'新闻报道\', \'财务报告\', \'公司公告\', \'分析师报告\']里的什么类别','财务报告'),('"本公司高兴地宣布成功完成最新一轮并购交易,收购了一家在人工智能领域领先的公司。这一战略举措将有助于扩大我们的业务领域,提高市场竞争力"是[\'新闻报道\', \'财务报告\', \'公司公告\', \'分析师报告\']里的什么类别','公司公告'),('"最新的行业分析报告指出,科技公司的创新将成为未来增长的主要推动力。云计算、人工智能和数字化转型被认为是引领行业发展的关键因素,投资者应关注这些趋势"是[\'新闻报道\', \'财务报告\', \'公司公告\', \'分析师报告\']里的什么类别','分析师报告')]
2.2.3 定义inference函数
    sentences = [
"今天,央行决定通过降低利率来刺激经济增长。这一决策预计会影响到贷款利率,并在接下来的几个季度对金融市场产生深远影响。",
"ABC公司今日宣布,他们已成功收购了XYZ公司的股权。这一重要的收购交易有助于ABC公司扩展业务范围,增强市场竞争力。据悉,这次收购将进一步巩固ABC公司在行业中的地位,并为未来的业务发展提供更广阔的空间。详细信息请参阅公司官方网站公告栏。",
"公司资产负债表显示,公司偿债能力强劲,现金流充足,为未来投资和扩张提供了坚实的财务基础。",
"最新的分析报告指出,可再生能源行业预计将在未来几年经历持续增长,投资者应该关注这一领域的投资机会",
]definference(sentences: list,custom_settings: dict):
"""推理函数。Args:sentences (List[str]): 待推理的句子。custom_settings (dict): 初始设定,包含人为给定的 few-shot example。"""
for sentence in sentences:
#没啥含义,就是改变打印的颜色。
with console.status("[bold bright_green] Model Inference..."):
#sentence_prompt =f'"{sentence}"是{custom_settings["class_list"]}里的什么类别?'response, history = model.chat(tokenizer, sentence_prompt, history=custom_settings['pre_history'])
print(f'>>>[bold bright_red]sentence:{sentence}')
print(f'>>>[bold bright_green]inference answer:{response}')
print(f'history-->{history}')
print("*"*80)

输入

1、sentences :待推理的句子。

2、custom_settings :init_prompts准备好的 提示工程。

流程:

1、遍历需要推理的句子

2、执行核心代码model.chat(tokenizer, sentence_prompt, history=custom_settings['pre_history'])

其中:

tokenizer:就是代码的分词器(可以理解为单词的最小单元)

sentence_prompt:将问题句子补充成完成的prompt

history:之前准备好的历史语句

打印的结果:

>>>sentence:今天,央行决定通过降低利率来刺激经济增长。这一决策预计会影响到贷款利率,并在接下来的几个季度对金融市场产生深远影响。
>>>inference answer:新闻报道
>>>sentence:ABC公司今日宣布,他们已成功收购了XYZ公司的股权。这一重要的收购交易有助于ABC公司扩展业务范围,增强市场竞争力。据悉,这次收购将进一步巩
固ABC公司在行业中的地位,并为未来的业务发展提供更广阔的空间。详细信息请参阅公司官方网站公告栏。
>>>inference answer:公司公告
********************************************************************************
>>>sentence:公司资产负债表显示,公司偿债能力强劲,现金流充足,为未来投资和扩张提供了坚实的财务基础。
>>>inference answer:财务报告
********************************************************************************
>>>sentence:最新的分析报告指出,可再生能源行业预计将在未来几年经历持续增长,投资者应该关注这一领域的投资机会
>>>inference answer:分析师报告

可以看到分类成功了,此时我有大胆的想法。如果我输入一句和所有类别毫不相关的话会怎么样?

sentences = ["我今天中午和朋友吃了牛肉粉丝汤,不小心洒了一地"]

它会打印成:新闻报道

这时候只要在prompt增加:

"现在你是一个文本分类器,你需要按照要求将我给你的句子分类到:['新闻
报道', '财务报告', '公司公告', '分析师报告']类别中。如果都不是就输出:'其他' ",

结果就可以变成:

>>>sentence:我今天中午和朋友吃了牛肉粉丝汤,不小心洒了一地
>>>inference answer:其他
2.2.4 完整代码
# —*-coding:utf-8-*-
"""
利用 LLM 进行文本分类任务。
"""
from rich importprint
from rich.console importConsole
from transformers importAutoTokenizer,AutoModel
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"# 提供所有类别以及每个类别下的样例
class_examples ={
'新闻报道':'今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整,以适应市场的不确定性。',
'财务报告':'本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。',
'公司公告':'本公司高兴地宣布成功完成最新一轮并购交易,收购了一家在人工智能领域领先的公司。这一战略举措将有助于扩大我们的业务领域,提高市场竞争力',
'分析师报告':'最新的行业分析报告指出,科技公司的创新将成为未来增长的主要推动力。云计算、人工智能和数字化转型被认为是引领行业发展的关键因素,投资者应关注这些趋势'}# 定义init_prompts函数
definit_prompts():
'''这里是对函数的功能进行注释,方便他人理解:该函数的目的是初始化前置prompt,便于模型做Few-shot:return: dict字典'''class_list =list(class_examples.keys())
print(f'分类的类别数:{class_list}')pre_history =[
(f'现在你是一个文本分类器,你需要按照要求将我给你的句子分类到:{class_list}类别中。',
f'好的。')
]
# 遍历给的示例样本
for _type, example in class_examples.items():
# print(f'键--》{_type}')
# print(f'值--》{example}')pre_history.append((f'"{example}"是{class_list}里的什么类别', _type))# print(f'pre_history--》{pre_history}')
return{"class_list":class_list,"pre_history":pre_history}definference(sentences: list,custom_settings: dict):
"""推理函数。Args:sentences (List[str]): 待推理的句子。custom_settings (dict): 初始设定,包含人为给定的 few-shot example。"""
for sentence in sentences:
with console.status("[bold bright_green] Model Inference..."):sentence_prompt =f'"{sentence}"是{custom_settings["class_list"]}里的什么类别?'response, history = model.chat(tokenizer, sentence_prompt, history=custom_settings['pre_history'])
print(f'>>>[bold bright_red]sentence:{sentence}')
print(f'>>>[bold bright_green]inference answer:{response}')
print(f'history-->{history}')
print("*"*80)if __name__ =='__main__':console =Console()
#device = 'cuda:0'device ='cpu'tokenizer =AutoTokenizer.from_pretrained("./ChatGLM-6B/THUDM/chatglm-6b-int4",trust_remote_code=True)
# model = AutoModel.from_pretrained("./ChatGLM-6B/THUDM/chatglm-6b", trust_remote_code=True).half().cuda()model =AutoModel.from_pretrained("./ChatGLM-6B/THUDM/chatglm-6b-int4",trust_remote_code=True).float()model.to(device)# sentences = [
#     "今天,央行决定通过降低利率来刺激经济增长。这一决策预计会影响到贷款利率,并在接下来的几个季度对金融市场产生深远影响。",
#     "ABC公司今日宣布,他们已成功收购了XYZ公司的股权。这一重要的收购交易有助于ABC公司扩展业务范围,增强市场竞争力。据悉,这次收购将进一步巩固ABC公司在行业中的地位,并为未来的业务发展提供更广阔的空间。详细信息请参阅公司官方网站公告栏。",
#     "公司资产负债表显示,公司偿债能力强劲,现金流充足,为未来投资和扩张提供了坚实的财务基础。",
#     "最新的分析报告指出,可再生能源行业预计将在未来几年经历持续增长,投资者应该关注这一领域的投资机会",
#     ]
# sentences = ["金融系统是建设金融强国责无旁贷的主力军,必须切实把思想和行动统一到党中央决策部署上来,深刻把握建设金融强国的精髓要义和实践要求,不断增强使命感、责任感,推动宏伟蓝图一步步变成美好现实"]sentences =["我今天中午和朋友吃了牛肉粉丝汤,不小心洒了一地"]custom_settings = init_prompts()
print(custom_settings)inference(sentences,custom_settings)

        主函数主要调用本次使用的tokenizer和model。

注意

        如果用mac在执行过程中选用了chatglm-6b-int4模型,会报错,

    logger.warning("Failed to load cpm_kernels:", exception)
Message: 'Failed to load cpm_kernels:'
Arguments: (RuntimeError('Unknown platform: darwin'),)

        还能执行的话就不用管他,实在不行就切换成chatglm-6b模型即可。

       如果你要用gpu跑模型,可以用这个代码替换

# model = AutoModel.from_pretrained("./ChatGLM-6B/THUDM/chatglm-6b", trust_remote_code=True).half().cuda()

2.3 文本信息抽取

        其实文本信息抽取也是一致的主要还是实现init_prompts函数和inference函数

2.3.1 实现init_prompts函数
import re
import jsonfrom rich importprint
from transformers importAutoTokenizer,AutoModel
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"# 定义不同实体下的具备属性
schema ={
'金融':['日期','股票名称','开盘价','收盘价','成交量'],
}# 信息抽取的模版
IE_PATTERN ="{}\n\n提取上述句子中{}的实体,并按照JSON格式输出,上述句子中不存在的信息用['原文中未提及']来表示,多个值之间用','分隔。"# 提供一些例子供模型参考
ie_examples ={
'金融':[
{
'content':'2023-01-10,股市震荡。股票古哥-D[EOOE]美股今日开盘价100美元,一度飙升至105美元,随后回落至98美元,最终以102美元收盘,成交量达到520000。',
'answers':{
'日期':['2023-01-10'],
'股票名称':['古哥-D[EOOE]美股'],
'开盘价':['100美元'],
'收盘价':['102美元'],
'成交量':['520000'],
}
}
]
}# 定义init_prompts函数
definit_prompts():
"""初始化前置prompt,便于模型做 incontext learning。"""ie_pre_history =[
(
"现在你需要帮助我完成信息抽取任务,当我给你一个句子时,你需要帮我抽取出句子中实体信息,并按照JSON的格式输出,上述句子中没有的信息用['原文中未提及']来表示,多个值之间用','分隔。",
'好的,请输入您的句子。'
)
]
for _type, example_list in ie_examples.items():
print(f'_type-->{_type}')
print(f'example_list-->{example_list}')
print(f'*'*80)
for example in example_list:sentence = example["content"]properties_str =', '.join(schema[_type])
print(f'properties_str-->{properties_str}')schema_str_list =f'"{_type}"({properties_str})'
print(f'schema_str_list-->{schema_str_list}')sentence_with_prompt = IE_PATTERN.format(sentence, schema_str_list)
print(f'sentence_with_prompt-->{sentence_with_prompt}')ie_pre_history.append((f"{sentence_with_prompt}",f"{json.dumps(example['answers'], ensure_ascii=False)}"))
print(f'ie_pre_history-->{ie_pre_history}')return{"ie_pre_history":ie_pre_history}init_prompts()

a.提供一个Few-shot的样例,定义不同实体下的具备属性

b.将prompt补充完整

c.增加至ie_pre_history当中

打印如下:

_type-->金融
example_list-->[{'content':
'2023-01-10,股市震荡。股票古哥-D[EOOE]美股今日开盘价100美元,一度飙升至105美元
,随后回落至98美元,最终以102美元收盘,成交量达到520000。','answers':{'日期':
['2023-01-10'],'股票名称':['古哥-D[EOOE]美股'],'开盘价':['100美元'],
'收盘价':['102美元'],'成交量':['520000']}}]
********************************************************************************
properties_str-->日期,股票名称,开盘价,收盘价,成交量
schema_str_list-->"金融"(日期,股票名称,开盘价,收盘价,成交量)
sentence_with_prompt-->2023-01-10,股市震荡。股票古哥-D[EOOE]美股今日开盘价100美
元,一度飙升至105美元,随后回落至98美元,最终以102美元收盘,成交量达到520000。提取上述句子中"金融"(日期,股票名称,开盘价,收盘价,
成交量)的实体,并按照JSON格式输出,上述句子中不存在的信息用['原文中未提及']来表
示,多个值之间用','分隔。
ie_pre_history-->[("现在你需要帮助我完成信息抽取任务,当我给你一个句子时,你需要
帮我抽取出句子中实体信息,并按照JSON的格式输出,上述句子中没有的信息用['原文中未
提及']来表示,多个值之间用','分隔。",'好的,请输入您的句子。'),
('2023-01-10,股市震荡。股票古哥-D[EOOE]美股今日开盘价100美元,一度飙升至105美元
,随后回落至98美元,最终以102美元收盘,成交量达到520000。\n\n提取上述句子中"金融
"(日期, 股票名称, 开盘价, 收盘价, 
成交量)的实体,并按照JSON格式输出,上述句子中不存在的信息用[\'原文中未提及\']来
表示,多个值之间用\',\'分隔。','{"日期": ["2023-01-10"], "股票名称": 
["古哥-D[EOOE]美股"], "开盘价": ["100美元"], "收盘价": ["102美元"], "成交量": 
["520000"]}')]
2.3.2 定义inference函数
def inference(sentences: list,custom_settings: dict):
"""推理函数。Args:sentences (List[str]): 待抽取的句子。custom_settings (dict): 初始设定,包含人为给定的 few-shot example。"""
for sentence in sentences:cls_res ="金融"
if cls_res notin schema:
print(f'The type model inferenced {cls_res} which is not in schema dict, exited.')exit()properties_str =', '.join(schema[cls_res])schema_str_list =f'"{cls_res}"({properties_str})'sentence_with_ie_prompt = IE_PATTERN.format(sentence, schema_str_list)
# print(f'sentence_with_prompt-->{sentence_with_ie_prompt}')ie_res, history = model.chat(tokenizer,sentence_with_ie_prompt,history=custom_settings["ie_pre_history"])ie_res = clean_response(ie_res)
print(f'>>> [bold bright_red]sentence: {sentence}')
print(f'>>> [bold bright_green]inference answer:{ie_res} ')

a.定义输入:

        sentences (List[str]): 待抽取的句子。custom_settings (dict): 初始设定,包含人为给定的 few-shot example。

b.定义类别:cls_res = "金融"

        这里将类别写死了。如果有多个类别。可以先利用 文本分类 实现后,在进行文本信息抽取。

c.将输入的sentences补充完整,调用 model.chat

d.将模型结果做一个后处理,提取json模型并输出

打印如下:

>>> sentence: 
2023-02-15,寓意吉祥的节日,股票佰笃[BD]美股开盘价10美元,虽然经历了波动,但最终
以13美元收盘,成交量微幅增加至460,000,投资者情绪较为平稳。
>>> inference answer:{'日期': ['2023-02-15'], '股票名称': ['佰笃[BD]美股'], 
'开盘价': ['10美元'], '收盘价': ['13美元'], '成交量': ['460,000']}
2.3.3 完整代码
import re
import jsonfrom rich importprint
from transformers importAutoTokenizer,AutoModel
import os
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"# 定义不同实体下的具备属性
schema ={
'金融':['日期','股票名称','开盘价','收盘价','成交量'],
}# 信息抽取的模版
IE_PATTERN ="{}\n\n提取上述句子中{}的实体,并按照JSON格式输出,上述句子中不存在的信息用['原文中未提及']来表示,多个值之间用','分隔。"# 提供一些例子供模型参考
ie_examples ={
'金融':[
{
'content':'2023-01-10,股市震荡。股票古哥-D[EOOE]美股今日开盘价100美元,一度飙升至105美元,随后回落至98美元,最终以102美元收盘,成交量达到520000。',
'answers':{
'日期':['2023-01-10'],
'股票名称':['古哥-D[EOOE]美股'],
'开盘价':['100美元'],
'收盘价':['102美元'],
'成交量':['520000'],
}
}
]
}# 定义init_prompts函数
definit_prompts():
"""初始化前置prompt,便于模型做 incontext learning。"""ie_pre_history =[
(
"现在你需要帮助我完成信息抽取任务,当我给你一个句子时,你需要帮我抽取出句子中实体信息,并按照JSON的格式输出,上述句子中没有的信息用['原文中未提及']来表示,多个值之间用','分隔。",
'好的,请输入您的句子。'
)
]
for _type, example_list in ie_examples.items():
# print(f'_type-->{_type}')
# print(f'example_list-->{example_list}')
# print(f'*'*80)
for example in example_list:sentence = example["content"]properties_str =', '.join(schema[_type])
# print(f'properties_str-->{properties_str}')schema_str_list =f'"{_type}"({properties_str})'
# print(f'schema_str_list-->{schema_str_list}')sentence_with_prompt = IE_PATTERN.format(sentence, schema_str_list)
print(f'sentence_with_prompt-->{sentence_with_prompt}')ie_pre_history.append((f"{sentence_with_prompt}",f"{json.dumps(example['answers'], ensure_ascii=False)}"))
print(f'ie_pre_history-->{ie_pre_history}')return{"ie_pre_history":ie_pre_history}defclean_response(response: str):
"""后处理模型输出。Args:response (str): _description_"""
if'```json'in response:res = re.findall(r'```json(.*?)```', response)
iflen(res)and res[0]:response = res[0]response = response.replace('、',',')
try:
return json.loads(response)
except:
return responsedefinference(sentences: list,custom_settings: dict):
"""推理函数。Args:sentences (List[str]): 待抽取的句子。custom_settings (dict): 初始设定,包含人为给定的 few-shot example。"""
for sentence in sentences:cls_res ="金融"
if cls_res notin schema:
print(f'The type model inferenced {cls_res} which is not in schema dict, exited.')exit()properties_str =', '.join(schema[cls_res])schema_str_list =f'"{cls_res}"({properties_str})'sentence_with_ie_prompt = IE_PATTERN.format(sentence, schema_str_list)
# print(f'sentence_with_prompt-->{sentence_with_ie_prompt}')ie_res, history = model.chat(tokenizer,sentence_with_ie_prompt,history=custom_settings["ie_pre_history"])ie_res = clean_response(ie_res)
print(f'>>> [bold bright_red]sentence: {sentence}')
print(f'>>> [bold bright_green]inference answer:{ie_res} ')if __name__ =='__main__':
#device = 'cuda:0'device ='cpu'tokenizer =AutoTokenizer.from_pretrained("./ChatGLM-6B/THUDM/chatglm-6b-int4",trust_remote_code=True)
#model = AutoModel.from_pretrained("./ChatGLM-6B/THUDM/chatglm-6b",
# trust_remote_code=True).half().cuda()model =AutoModel.from_pretrained("./ChatGLM-6B/THUDM/chatglm-6b-int4",trust_remote_code=True).float()model.to(device)sentences =[
'2023-02-15,寓意吉祥的节日,股票佰笃[BD]美股开盘价10美元,虽然经历了波动,但最终以13美元收盘,成交量微幅增加至460,000,投资者情绪较为平稳。',
'2023-04-05,市场迎来轻松氛围,股票盘古(0021)开盘价23元,尽管经历了波动,但最终以26美元收盘,成交量缩小至310,000,投资者保持观望态度。',
]custom_settings = init_prompts()inference(sentences,custom_settings)

2.4 文本匹配

        文本匹配具体和我之前做的bert是一个项目。这里主要食用prompt实现。和上面基本一致,就不重点阐述了

完整代码如下:

2.4.1 完整代码
from rich importprint
from transformers importAutoTokenizer,AutoModelimport os# 提供相似,不相似的语义匹配例子
examples ={
'是':[
('公司ABC发布了季度财报,显示盈利增长。','财报披露,公司ABC利润上升。'),
],
'不是':[
('黄金价格下跌,投资者抛售。','外汇市场交易额创下新高。'),
('央行降息,刺激经济增长。','新能源技术的创新。')
]
}definit_prompts():
"""初始化前置prompt,便于模型做 incontext learning。"""pre_history =[
(
'现在你需要帮助我完成文本匹配任务,当我给你两个句子时,你需要回答我这两句话语义是否相似。只需要回答是否相似,不要做多余的回答。',
'好的,我将只回答”是“或”不是“。'
)
]
for key, sentence_pairs in examples.items():
# print(f'key-->{key}')
# print(f'sentence_pairs-->{sentence_pairs}')
for sentence_pair in sentence_pairs:sentence1, sentence2 = sentence_pair
# print(f'sentence1-->{sentence1}')
# print(f'sentence2-->{sentence2}')pre_history.append((f'句子一:{sentence1}\n句子二:{sentence2}\n上面两句话是相似的语义吗?',key))
return{"pre_history": pre_history}definference(sentence_pairs: list,custom_settings: dict):
"""推理函数。Args:model (transformers.AutoModel): Language Model 模型。sentence_pairs (List[str]): 待推理的句子对。custom_settings (dict): 初始设定,包含人为给定的 few-shot example。"""
for sentence_pair in sentence_pairs:sentence1, sentence2 = sentence_pairsentence_with_prompt =f'句子一: {sentence1}\n句子二: {sentence2}\n上面两句话是相似的语义吗?'response, history = model.chat(tokenizer, sentence_with_prompt, history=custom_settings['pre_history'])
print(f'>>> [bold bright_red]sentence: {sentence_pair}')
print(f'>>> [bold bright_green]inference answer: {response}')
# print(history)if __name__ =='__main__':
#device = 'cuda:0'device ='cpu'tokenizer =AutoTokenizer.from_pretrained("/Users/ligang/PycharmProjects/llm/ChatGLM-6B/THUDM/chatglm-6b-int4",trust_remote_code=True)
#model = AutoModel.from_pretrained("./ChatGLM-6B/THUDM/chatglm-6b",
# trust_remote_code=True).half().cuda()model =AutoModel.from_pretrained("/Users/ligang/PycharmProjects/llm/ChatGLM-6B/THUDM/chatglm-6b-int4",trust_remote_code=True).float()model.to(device)sentence_pairs =[
('股票市场今日大涨,投资者乐观。','持续上涨的市场让投资者感到满意。'),
('油价大幅下跌,能源公司面临挑战。','未来智能城市的建设趋势愈发明显。'),
('利率上升,影响房地产市场。','高利率对房地产有一定冲击。'),
]custom_settings = init_prompts()inference(sentence_pairs,custom_settings)

 

相关文章:

LLM_入门指南(零基础搭建大模型)

本文主要介绍大模型的prompt,并且给出实战教程。即使零基础也可以实现大模型的搭建。 内容:初级阶段的修炼心法,帮助凝聚和提升内力,为后续修炼打下基础。 1、prompt 1.1含义和作用 prompt就是提示工程的意思。在大型语言模型中…...

Element Plus 与 Vue 3:构建现代化 Web 应用的完美搭档

引言 Element Plus是基于Vue 3的组件库,它继承了Element UI的优秀基因,为Vue 3应用提供了丰富的界面组件。Element Plus不仅拥有与Element UI相同的高质量组件,还针对Vue 3进行了优化和更新,确保了与Vue 3的无缝集成。 环境准备…...

线程间通信与变量修改感知:几种常用方法

线程间通信与变量修改感知:几种常用方法 1. 使用volatile关键字2. 使用synchronized关键字3. 使用wait/notify/notifyAll机制4. 使用轮询(Polling) 💖The Begin💖点点关注,收藏不迷路💖 在Java…...

前后端通信 —— HTTP/HTTPS

目录 一、HTTP/HTTPS 简介 1、HTTP 2、HTTPS 二、HTTP 工作过程 三、HTTP 消息 1、HTTP消息结构 2、HTTP消息示例 四、HTTP 方法(常用) 1、GET 2、POST 3、PUT 4、DELETE 5、GET与POST对比 五、HTTP 状态码(常用) …...

人工智能 (AI) 应用:一个高精度ASD 诊断和照护支持系统

自闭症谱系障碍(ASD)是一种多方面的神经发育状况,影响全球大约1/100的儿童,而在中国,这一比例高达1.8%(引用自《中国0~6岁儿童孤独症谱系障碍筛查患病现状》),男童为2.6%…...

C# 1.方法

方法组成: 1.修饰符:public一般定义共有的 2.方法返回值:void 无返回值; 非void,可以写成其他类型例如int,float,string,string[]等 3.方法名:Add 大驼峰命名法,每一个首字符大写。…...

【C++进阶学习】第七弹——AVL树——树形结构存储数据的经典模块

二叉搜索树:【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 目录 一、AVL树的概念 二、AVL树的原理与实现 AVL树的节点 AVL树的插入 AVL树的旋转 AVL树的打印 AVL树的检查 三、实现AVL树的完整代码 四、总结 前言&#xff1a…...

px,em,rem之间的关系换算

px,em,rem之间的换算 px&#xff1a;普通大小 em&#xff1a;相对单位&#xff0c;相对于父元素的字体大小 rem&#xff1a;相对单位&#xff0c;相对于根元素&#xff08;html&#xff09;的字体大小 <!DOCTYPE html> <html lang"en"> <head>…...

HTTP——POST请求详情

POST请求 【传输实体文本】向指定资源提交数据进行处理请求&#xff08;例如提交表单或者上传文件&#xff09;。数据被包含在POST请求体中。POST 请求可能会导致新的资源的建立或已有资源的修改。 场景&#xff1a; 1. 提交用户注册信息。 2. 提交修改的用户信息。 常见的…...

外包干了1个月,技术明显退步。。。

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…...

LeetCode加油站(贪心算法/暴力,分析其时间和空间复杂度)

题目描述 一.原本暴力算法 最初的想法是&#xff1a;先比较gas数组和cost数组的大小&#xff0c;找到可以作为起始点的站点(因为如果你起始点的油还不能到达下一个站点&#xff0c;就不能作为起始点)。当找到过后&#xff0c;再去依次顺序跑一圈&#xff0c;如果剩余的油为负数…...

5.1 软件工程基础知识-软件工程概述

软件工程诞生原因 软件工程基本原理&#xff08;容易被考到&#xff09; 软件生存周期 能力成熟度模型 - CMM 能力成熟度模型 - CMMI 真题...

HttpUtil工具

http工具 用到的依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency><dependency><groupId>org.apache.httpcomponent…...

并发编程-锁的分类

锁的分类 可重入锁&不可重入锁 可重入&#xff1a;当一个线程获取某个锁后&#xff0c;再次获取这个锁的时候是可以直接拿到的。不可重入&#xff1a;当一个线程获取某个锁之后&#xff0c;再次获取这个锁的时候拿不到&#xff0c;必须等自己先释放锁再获取。synchronized…...

K8S系列-Kubernetes基本概念及Pod、Deployment、Service的使用

一、Kubernetes 的基本概念和术语 一、资源对象 ​ Kubernetes 的基本概念和术语大多是围绕资源对象 Resource Object 来说的&#xff0c;而资源对象在总体上可分为以下两类: 1、某种资源的对象 ​ 例如节点 Node) Pod 服务 (Service) 、存储卷 (Volume&#xff09;。 2、…...

在VSCode上创建Vue项目详细教程

1.前期环境准备 搭建Vue项目使用的是Vue-cli 脚手架。前期环境需要准备Node.js环境&#xff0c;就像Java开发要依赖JDK环境一样。 1.1 Node.js环境配置 1&#xff09;具体安装步骤操作即可&#xff1a; npm 安装教程_如何安装npm-CSDN博客文章浏览阅读836次。本文主要在Win…...

Go语言入门之流程控制简述

Go语言入门之流程控制简述 1.if语句 if语句和其他语言一样&#xff0c;只不过go语言的if不需要用括号包裹 if 语句的分支代码块的左大括号与 if 关键字在同一行上&#xff0c;这是 go 代码风格的统一要求 简单实例&#xff1a; func main() {// 猜数字a : 2if a > 0 {if a…...

接口测试框架基于模板自动生成测试用例!

引言 在接口自动化测试中&#xff0c;生成高质量、易维护的测试用例是一个重要挑战。基于模板自动生成测试用例&#xff0c;可以有效减少手工编写测试用例的工作量&#xff0c;提高测试的效率和准确性。 自动生成测试用例的原理 为了实现测试用例数据和测试用例代码的解耦&a…...

C++ STL stable_sort用法

一&#xff1a;功能 对区间内元素进行排序&#xff0c;保证相等元素的顺序&#xff08;稳定排序&#xff09; 二&#xff1a;用法 #include <iostream>struct Record {std::string label;int rank; };int main() {std::vector<Record> data {{"q", 1},…...

YOLO v8进行目标检测的遇到的bug小结

OSError: [WinError 1455] 页面文件太小&#xff0c;无法完成操作。 我的python环境是放在C盘的&#xff1a; 在“我的电脑”点击鼠标右键&#xff0c;打开“属性”点击高级系统设置点击“设置”找到“高级”点击“更改”分配“虚拟内存”&#xff08;这里需要重启电脑才能生…...

FastAPI -- 第二弹(响应模型、状态码、路由APIRouter、后台任务BackgroundTasks)

响应模型 添加响应模型 from typing import Anyfrom fastapi import FastAPI from pydantic import BaseModel, EmailStrapp FastAPI()class UserIn(BaseModel):username: strpassword: stremail: EmailStrfull_name: str | None Noneclass UserOut(BaseModel):username: s…...

案例 | 人大金仓助力山西政务服务核心业务系统实现全栈国产化升级改造

近日&#xff0c;人大金仓支撑山西涉企政策服务平台、政务服务热线联动平台、政务网、办件中心等近30个政务核心系统完成全栈国产化升级改造&#xff0c;推进全省通办、跨省通办、综合业务受理、智能审批、一件事一次办等业务的数字化办结进程&#xff0c;为我国数字政务服务提…...

如何用python写接口

如何用python写接口&#xff1f;具体步骤如下&#xff1a;  1、实例化server 2、装饰器下面的函数变为一个接口 3、启动服务 开发工具和流程&#xff1a; python库&#xff1a;flask 》实例化server&#xff1a;server flask.Flask(__name__) 》server.route(/index,met…...

轻量级可扩展易航网址引导系统源码V2.45

由于现在网站行业的不稳定&#xff0c;导致很地址频繁更换&#xff0c;不仅是网站&#xff0c;联系QQ&#xff0c;加群链接等需要更换时&#xff0c;好不容易发展的客户会因为找不到您新的网站地址而流失&#xff0c;有了引导页以后就可以安心地宣传无需担心客户丢失的问题。 …...

解决ESLint和Prettier冲突的问题

在配置了ESLint的项目中使用Prettier进行格式化可能会出现冲突&#xff0c;不如Prettier配置了使用双引号&#xff0c;ESLint配置了单引号&#xff0c;当然可以一个一个改成一样的配置&#xff0c;但是比较麻烦。我发现可以直接使用ESLint的规则进行格式化。在VSCode配置过程如…...

C判断一个点在三角形上

背景 鼠标操作时&#xff0c;经常要判断是否命中显示控件&#xff0c;特开发此算法快速判断。 原理 三角形三等分点定理是指在任意三角形ABC中&#xff0c;可以找到三个点D、E和F&#xff0c;使得线段AD、BE和CF均等分三角形ABC。 这意味着三个等分点分别位于三个边界上&…...

物业系统自主研发接口测试框架

1、自主研发框架整体设计 1.1、什么是测试框架? 在了解什么是自动化测试框架之前&#xff0c;先了解一下什么叫框架?框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法;另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架…...

手机和电脑通过TCP传输

一.工具 手机端&#xff1a;网络调试精灵 电脑端&#xff1a;野火网络调试助手 在开始通信之前&#xff0c;千万要查看一下电脑的防火墙是否关闭&#xff0c;否则可能会无法通信 在开始通信之前&#xff0c;千万要查看一下电脑的防火墙是否关闭&#xff0c;否则可能会无法通信…...

Git 在commit后,撤销commit

1. 撤销已经add&#xff0c;但是没有commit的问题 git reset HEAD 2. 撤销已经commit&#xff0c;但是没有push到远端的文件&#xff08;仅撤销commit 保留add操作&#xff09; 撤销上一次的提交 git reset --soft HEAD^windows 系统使用提示 more&#xff0c;需要多加一个…...

多模态大模型 - MM1

1. 摘要 本文主要通过分析模型结构和数据选择讨论如何构建一个好的多模态大模型&#xff08;MLLM&#xff09;&#xff0c;并同时提出了MM1模型&#xff0c;包括30B dense版本和64B的MoE版本。 具体贡献&#xff1a; 模型层面&#xff1a;影响效果的重要性排序为&#xff1a;…...