Skip to content

AI

基本概念

AIGC 和 AGI

AIGC(AI生成内容): 接下来是AIGC,既AI Generated Content。这就是利用AI技术生成的内容。比如:Chat GPT

  • 文本生成:新闻报道、广告文案、产品描述等.
  • 图像生成:图像素材、艺术创作、设计等.
  • 音频生成:音乐、电台广播等.
  • 视频生成:视频剪辑、电影预告片等.

AGI(通用人工智能): Artificial General Intelligence,AGI的目标是创造能想人一样可以思考、学习、执行多种任务的系统。

大模型分类

按照输入数据类型的不同,大模型可以分为以下三类:

  • 语言大模型: 是指再自然语言处理(Natural Language Processing,NLP)领域中的一类大模型,通常用于处理文本数据和理解自然语言。
  • 视觉大模型: 是指再计算机视觉(Computer Vision,CV)领域中使用的大模型,通常用于图像处理和分析。
  • 多模态大模型: 是指能够处理多种不同类型数据的大模型,例如文本、图像、音频等多模态数据。这类模型结合了NLP和CV的能力。

Transformer

目前新版的语言模型都是基于Transformer架构训练的。

Transformer是一种深度学习架构,它的核心思想是:通过注意力机制(Attention)捕捉序列中不同部分之间的关系,而不是想以前的模型(如RNN)那样一步步按顺序处理。

特点:

  • 并行计算:不想RNN需要一步步计算,可以同时处理所有输入。
  • 捕捉长距离依赖:通过注意力机制,可以捕捉序列中相隔很远的部分之间的关系。
  • 扩展性强:可以堆叠很多层,形成超大的模型。

自注意力机制

Self-Attention(自注意力)是一种用于处理序列数据的机制,特别是在深度学习中 的Transformer模型中被广泛使用。它的直白解释如下:

  1. 关注自身的能力: Self-Attention允许模型在处理输入序列时关注序列中各个位置之间的关系,而不是简单地按顺序逐个处理。
  2. 自注意力权重: 对于每个输入位置,Self-Attention会计算一个与其他位置的关联程度,称为自注意力权重。这些权重表示了每个位置在整个序列中的重要性。
  3. 信息汇聚: 通过将每个位置的自注意力权重与相应位置的特征向量相乘,并将结果进行加权求和,可以汇聚输入序列的信息,产生新的表示。
  4. 并行计算: Self-Attention可以并行地计算每个位置的自注意力权重,因此在实践中往往具有较高的效率。

总的来说,Self-Attention允许模型在处理序列数据时同时关注不同位置的信息,并根据位置之间的关系来提取和汇聚输入序列的信息,从而更好地理解序列数据并改善模型性能。

熟悉各种大模型接口调用

Open Al 的API为开发者提供了强大的工具来构建智能应用程序。无论是AI领域的新人还是经验手富的开发者,掌握如何使用Python调用Open Al 库都是一项必备技能。 使用 Open Al 库连接国产大模型已经在多个领域得到了广泛应用,包括:千问,智普,百川,文心一言等等。 在开始编写代码之前,确保已经安装新版Python环境(3.11及以上),并且已经安装了Open AI库。你可以通过

shell
pip install openai

Embeddings模型

Embeddings(嵌入)在自然语言处理(NLP)中起重要作用,其目的是将高维、离散的文本数据(如单词或短语)转换为低维、连续的向量表示。这些向量不仅编码了词本身的含义,还捕捉到了词语之间的语义和句法关系。通过embeddings,原本难以直接处理的文本数据可以被机器学习模型理解和操作。每个公司都有自己的Embeddings模型 它就是将「不可计算」「非结构化」的词转化为「可计算」「结构化」的向量。

如果一个单词在一些上下文中经常与另一个单词一起出现,那么这两个单词的嵌入向量在向量空间中就会有相似的位置,这意味着它们有相似的含义和语义。例如queen和king接近、man和woman接近。

案例:利用Embeddings将指定信息向量化

需求:有一个评论的csv文件,有id,time,userId,goodId,Score,Summary,Text字段,需要将摘要与内容进行向量化。

python
from openai import OpenAI
import pandas as pd

df = pd.read_csv('datas/file.csv',index_col=0) #忽略第一列

df = df[['Time','UserId','Score','Summary','Text']]

# 清洗数据
df = df.dropna() # 删除NaN,NaT的数据
df['Text_content'] = 'Summary:' + df.Summary.str.strip() + "; Text:" + df.Text.str.strip()

client = OpenAI(base_url="", api_key="")
def text_to_embedding(text, model):
	return client.embeddings.create(input=text, model=model).data[0].embedding

# 把Text_content字段的文本值,转化为向量,存放到新字段'embedding'
df['embedding'] = df.Text_content.apply(lambda x: text_to_embedding(x, 'embedding_model'))

df.to_csv('datas/output.csv')

余弦相似度

余弦相似度是一个衡量两个非零向量之间夹角的度量,它给出的是这两个向量在多大程 度上指向相同的方向。余弦相似度的值域是[-1,1],其中1表示两个向量完全相同方向,-1表示完全相反方向,而0则表示两个向量正交(即不相关)。 具体来说,公式: $$ \cos\theta = \frac{\vec{A} \cdot \vec{B}}{|\vec{A}| \times |\vec{B}|} $$

其中:

  • A・B 是向量A和向量B的点积(dot product),通过np.dot(a, b)来计算。
  • ||A||和||B||分别是向量A和向量B的L2范数(欧几里得长度),通过np.linalg.norm(a)np.linalg.norm(b)来计算。

案例:给一个关键词/一句话,去检索相似的用户评论

python
client = OpenAI(
    base_url='https://open.bigmodel.cn/api/paas/v4',
    api_key='5a8d2ab8074b459f93f7404df0b8cd22.zcwMrP6OWnJkR0nR',
)

# 指定模型将指定字符串变为向量
def text_to_embedding(text, model):
	return client.embeddings.create(input=text, model=model).data[0].embedding

# 计算余弦相似度
def cosine_distance(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))


"""给一个关键词/一句话,去检索相似的用户评论"""
def search_similar_text(df, search_keywords, top_n = 3):
    # literal_eval 解释/计算一个字符串
    # 把str变成矩阵
    df['embedding_vector'] = df['embedding'].apply(ast.literal_eval)
    input_vector = text_to_embedding(search_keywords,'embedding_model')

    df['similarity'] = df.embedding_vector.apply(lambda vector: cosine_distance(vector,input_vector))

    res = (df.sort_values('similarity', ascending=False)
           .head(top_n)
           .combined.str.replace('Summary:', '')
           .str.replace('; Text:', '')
           )
    for r in res:
        print(r)
        print('-'*30)

if __name__ == '__main__':
    df = pd.read_csv('./data/output.csv')
    search_similar_text(df, "你好")

通过代码与ChatGPT对话

python
client = OpenAI(
    base_url='https://open.bigmodel.cn/api/paas/v4',
    api_key='5a8d2ab8074b459f93f7404df0b8cd22.zcwMrP6OWnJkR0nR',
)

completion = client.chat.completions.create(
	model="gpt-40-mini",
	messages=[
		{"role": "system", "content": "你是一个快乐的助手"},
		{"role": "user", "content": "帮我生成一个两百字的家长会心的。"}
	]
)

print(completion)
print(completion.choices[0].message)

OpenAI的参数

  • model:必选参数,大模型的名称
  • messages:必选参数,提示词;(里面可以指定角色)
  • max_tokens: 可选参数,代表返回结果的token数量;
  • temperature: 可选参数,取值范围为0-2,默认值为1。参数代表采样温度,数值越小 则模型会倾向于选择概率较高的词汇,生成的文本会更加保守;而当temperature值较高 时,模型会更多地选择概率较低的词汇,生成的文本会更加多样;
  • top_p:可选参数,取值范围为0-1,默认值为1,和temperature作用类似,用于控制输 出文本的随机性,数值越趋近与1,输出文本随机性越强,越趋近于0文本随机性越弱;通 常来说若要调节文本随机性,top_p和temperature两个参数选择一个进行调整即可;这里 更推荐使用temperature参数进行文本随机性调整;
  • n:可选参数,默认值为1,表示一个提示返回几个Completion;
  • stream: 可选参数,默认值为False,表示回复响应的方式,当为False时,模型会等待返 回结果全部生成后一次性返回全部结果,而为True时,则会逐个字进行返回;
  • stop:可选参数,默认为nul,该参数接受一个或多个字符串,用于指定生成文本的停止 信号。当模型生成的文本遇到这些字符串中的任何一个时,会立即停止生成。这可以用来 控制模型的输出长度或格式; 分别用于控制生成文本中新单词的出现频率和单词的重复频率,可以避免生成的文本过于重复或单调。
  • presence_penalty:可选参数,默认为0,取值范围为[-2,2],该参数用于调整模型生成新 内容(例如新的概念或主题)的倾向性。较高的值会使模型更倾向于生成新内容,而较低 的值则会使模型更倾向于坚持已有的内容,当返回结果篇幅较大并且存在前后主题重复 时,可以提高该参数的取值;
  • frequency_penalty:可选参数,默认为0,取值范围为[-2,2],该参数用于调整模型重复 自身的倾向性。较高的值会使模型更倾向于避免重复,而较低的值则会使模型更可能重复 自身;当返回结果篇幅较大并且存在前后语言重复时,可以提高该参数的取值;
  • tools:可以调用的函数;
  • tool choice:调用函数的策略

生成文本时,建议温度值≥1,如果做逻辑推理和数学推理建议<0.5

Released under the MIT License.