动手实践:5个AI项目让你的AI技能提升

文摘   2024-10-17 19:24   新加坡  

在人工智能快速发展的今天,仅仅了解理论远远不够。

真正掌握AI技能的关键在于动手实践,本文为你精心挑选了5个实用的AI项目,涵盖从入门到进阶的不同难度级别。

通过这些项目,你将不仅学习到核心AI概念,更能将这些概念应用到解决实际问题中,从而全面提升你的AI技能。

选择项目的正确方法

在开始之前,让我们纠正一个常见误区。很多人在思考项目的时候,第一个问题往往是"我要用什么技术?"虽然这种方法可以帮助你学习新工具,但还有一个更好的方式。

好的项目应该从一个不同的角度出发:"我要解决的问题是什么?"这不仅能让你在与潜在雇主分享时有更好的故事,更重要的是,解决实际问题是将技术技能转化为真正价值的关键。

接下来的5个项目都采用了这种以问题为先的方法。你可以直接实施这些想法,或者更好的是,用它们作为灵感来解决你个人面临的问题。

1. 简历优化助手 (入门级)

问题:在求职过程中,根据不同的职位描述来调整简历是一项耗时但很有效的工作。

解决方案:创建一个AI驱动的工具,自动根据职位描述优化简历。

实现步骤:

  1. 将你的简历转换为Markdown格式 (提示:ChatGPT可以帮你完成这一步)
  2. 在ChatGPT中实验不同的提示模板,输入你的简历和目标职位描述,输出优化后的简历
  3. 使用OpenAI的Python API调用GPT-4-turbo模型来动态重写简历
  4. 利用markdown和pdfkit库将优化后的简历转换为PDF格式 所需库: openai, markdown, pdfkit

技能提升:通过这个项目,你将学习如何使用API调用大语言模型,处理文本数据,以及自动化文档生成过程。这些都是在AI领域非常实用的技能。

下面是一个示例,用 OpenAI 的 GPT-4 模型来生成优化后的简历,然后通过 markdown 和 pdfkit 库将其转换为 PDF 格式。

import openai
import markdown
import pdfkit
import os

openai.api_key = 'YOUR_OPENAI_API_KEY'

# 读取简历文件
def read_resume(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        return file.read()

# 优化简历
def optimize_resume(resume_text, job_description):
    prompt = (
        f"我有一个用Markdown格式编写的简历和一个职位描述。"
        f"请调整我的简历,使其更符合职位要求,同时保持专业的语气。"
        f"根据职位描述,调整我的技能、经验和成就,突出与职位最相关的部分。"
        f"确保我的简历仍能体现我的独特资质和优势,但更强调符合职位要求的技能和经验。\n\n"
        f"### 这是我的简历(Markdown格式):\n{resume_text}\n\n"
        f"### 这是职位描述:\n{job_description}\n\n"
        f"请修改简历,使其:\n"
        f"- 使用职位描述中的关键词和短语。\n"
        f"- 调整每个职位下的要点,突出相关的技能和成就。\n"
        f"- 使我的经验以符合职位要求的方式呈现。\n"
        f"- 保持简洁、清晰和专业。"
    )
    try:
        response = openai.ChatCompletion.create(
            model="gpt-4-turbo",
            messages=[{"role""user""content": prompt}],
            max_tokens=1500,
            temperature=0.25
        )
        return response['choices'][0]['message']['content']
    except Exception as e:
        print(f"生成优化简历时出错: {e}")
        return "无法生成优化后的简历。"

# 将Markdown转换为HTML
def convert_markdown_to_html(markdown_text):
    return markdown.markdown(markdown_text)

# 将HTML转换为PDF
def convert_html_to_pdf(html_content, output_path):
    try:
        with open('temp.html''w', encoding='utf-8') as f:
            f.write(html_content)
        pdfkit.from_file('temp.html', output_path)
        os.remove('temp.html')
    except Exception as e:
        print(f"转换为PDF时出错: {e}")

# 主函数
def main():
    resume_path = 'resume.md'
    job_description = "目标职位描述:需要有Python开发经验,熟悉机器学习和数据分析。"
    resume_text = read_resume(resume_path)
    optimized_resume = optimize_resume(resume_text, job_description)
    print("优化后的简历:\n", optimized_resume)
    html_content = convert_markdown_to_html(optimized_resume)
    output_pdf_path = 'optimized_resume.pdf'
    convert_html_to_pdf(html_content, output_pdf_path)
    print(f"优化后的简历已保存为 {output_pdf_path}")

if __name__ == "__main__":
    main()

2. YouTube讲座总结器 (入门级)

问题:我们经常将感兴趣的技术讲座加入YouTube的"稍后观看"列表,但往往难以抽出时间一一去观看。

解决方案:创建一个AI工具,自动提取视频内容并生成简洁的摘要。

实现步骤:

  1. 使用正则表达式从YouTube链接中提取视频ID
  2. 利用youtube-transcript-api库获取视频字幕
  3. 在ChatGPT中实验不同的提示来有效总结字幕内容
  4. 使用OpenAI的API自动化整个过程

所需库: openai, youtube-transcript-api

技能提升:这个项目将帮助你掌握文本处理、API使用,以及自然语言处理中的文本摘要技术。你还将学习如何处理和分析视频数据,这在多媒体AI应用中非常有价值。

import openai
import re
from youtube_transcript_api import YouTubeTranscriptApi

openai.api_key = 'YOUR_OPENAI_API_KEY'

# 提取视频ID
def extract_video_id(youtube_url):
    video_id_regex = r'(?:v=|\/|\?v=|youtu\.be\/|\/embed\/|\/v\/|\/watch\?v=|v%3D|v\/|\/u\/w\/|embed\?v=|watch\?feature=player_embedded&v=)([0-9A-Za-z_-]{11})'
    match = re.search(video_id_regex, youtube_url)
    if match:
        return match.group(1)
    return None

# 获取视频字幕
def get_video_transcript(video_id):
    try:
        transcript = YouTubeTranscriptApi.get_transcript(video_id)
        text_list = [entry['text'for entry in transcript]
        return '\n'.join(text_list)
    except Exception as e:
        print(f"获取字幕时出错: {e}")
        return None

# 总结视频字幕
def summarize_transcript(transcript_text):
    if not transcript_text:
        return "字幕不可用。"
    prompt = (
        f"我有一个YouTube讲座的字幕,请总结主要内容和关键点,使总结简洁明了,并抓住讲座的精髓。\n\n"
        f"### 字幕:\n{transcript_text}"
    )
    try:
        response = openai.ChatCompletion.create(
            model="gpt-4-turbo",
            messages=[{"role""user""content": prompt}],
            max_tokens=1500
        )
        return response['choices'][0]['message']['content']
    except Exception as e:
        print(f"生成摘要时出错: {e}")
        return "无法生成摘要。"

# 主函数
def main():
    youtube_url = "视频链接在此"
    video_id = extract_video_id(youtube_url)
    if not video_id:
        print("无效的YouTube链接。")
        return

    transcript_text = get_video_transcript(video_id)
    if not transcript_text:
        print("无法获取字幕。")
        return

    summary = summarize_transcript(transcript_text)
    print("视频摘要:\n", summary)

if __name__ == "__main__":
    main()

3. PDF文档自动分类 (中级)

问题:如果你的电脑桌面上堆满了各种未读的研究论文或技术文档,手动整理将非常耗时。

解决方案:创建一个AI工具,自动分析PDF文件的内容,并根据主题将它们分类到不同的文件夹中。

实现步骤:

  1. 使用PyMuPDF库读取每篇文章的摘要
  2. 利用sentence-transformers库将摘要转换为文本嵌入,并存储在Pandas DataFrame中
  3. 使用sklearn中的聚类算法(如K-Means)对嵌入进行分组
  4. 为每个聚类创建文件夹,并将文件移动到相应的文件夹中

所需库: PyMuPDF, sentence_transformers, pandas, sklearn

技能提升:通过这个项目,你将深入学习文本嵌入技术、无监督学习算法,以及如何处理非结构化数据。这些技能在许多AI应用中都非常重要,尤其是在自然语言处理和文档分析领域。

import fitz  # PyMuPDF
import os
import pandas as pd
from sentence_transformers import SentenceTransformer
from sklearn.cluster import KMeans
import shutil

# 读取 PDF 文档摘要
def extract_summary(pdf_path):
    try:
        doc = fitz.open(pdf_path)
        text = ""
        for page_num in range(len(doc)):
            page = doc.load_page(page_num)
            text += page.get_text()
        doc.close()
        return text[:500]
    except Exception as e:
        print(f"Error reading {pdf_path}: {e}")
        return None

# 获取所有 PDF 文件的摘要
def get_all_summaries(pdf_folder):
    summaries = []
    pdf_files = [f for f in os.listdir(pdf_folder) if f.endswith('.pdf')]
    for pdf_file in pdf_files:
        pdf_path = os.path.join(pdf_folder, pdf_file)
        summary = extract_summary(pdf_path)
        if summary:
            summaries.append((pdf_file, summary))
    return summaries

# 生成文本嵌入
def generate_embeddings(summaries):
    model = SentenceTransformer('all-MiniLM-L6-v2')
    texts = [summary[1] for summary in summaries]
    embeddings = model.encode(texts)
    return embeddings

# 聚类并分类 PDF 文件
def cluster_pdfs(pdf_folder, summaries, embeddings, num_clusters=5):
    kmeans = KMeans(n_clusters=num_clusters, random_state=42, n_init='auto')
    labels = kmeans.fit_predict(embeddings)
    df = pd.DataFrame(summaries, columns=['filename''summary'])
    df['cluster'] = labels

    for cluster_num in range(num_clusters):
        cluster_folder = os.path.join(pdf_folder, f'cluster_{cluster_num}')
        if not os.path.exists(cluster_folder):
            os.makedirs(cluster_folder)

    for _, row in df.iterrows():
        src_path = os.path.join(pdf_folder, row['filename'])
        dest_folder = os.path.join(pdf_folder, f'cluster_{row['cluster']}')
        shutil.move(src_path, dest_folder)

# 主函数
def main():
    pdf_folder = 'path/to/your/pdf/folder'
    summaries = get_all_summaries(pdf_folder)
    if not summaries:
        print("No summaries extracted.")
        return

    embeddings = generate_embeddings(summaries)
    cluster_pdfs(pdf_folder, summaries, embeddings, num_clusters=5)
    print("PDF 文件已成功分类。")

if __name__ == "__main__":
    main()

4. 多模态搜索引擎 (中级)

问题:在技术报告中,重要信息往往以图表和图像的形式呈现,但传统的文本搜索无法捕捉这些视觉信息。

解决方案:创建一个能同时处理文本和图像的多模态搜索系统。

实现步骤:

  1. 使用PyMuPDF将PDF文档分割成小节并提取图像
  2. 使用多模态嵌入模型(可以在Hugging Face上找到)将文本块和图像表示为向量
  3. 将所有文档的嵌入存储在数据框中
  4. 对用户查询应用相同的嵌入模型
  5. 使用sklearn计算查询嵌入与知识库中每个项目的余弦相似度
  6. 返回相似度最高的前k个结果

所需库: PyMuPDF, transformers, pandas, sklearn

技能提升:这个项目将帮助你掌握多模态AI的核心概念,学习如何处理和整合不同类型的数据(文本和图像)。你还将深入了解向量检索和相似度计算,这些在搜索引擎和推荐系统中都是关键技能。

import fitz  # PyMuPDF
import os
import pandas as pd
from sentence_transformers import SentenceTransformer
from transformers import CLIPProcessor, CLIPModel
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
from PIL import Image
import io
import torch

# 提取 PDF 文档的小节和图像
def extract_text_chunks(pdf_path, chunk_size=1000, overlap_size=200):
    try:
        doc = fitz.open(pdf_path)
        chunks = []
        images = []
        for page_num in range(len(doc)):
            page = doc.load_page(page_num)
            text = page.get_text()
            start = 0
            while start < len(text):
                end = start + chunk_size
                chunk = text[start:end]
                chunks.append((pdf_path, page_num, chunk))
                start += chunk_size - overlap_size

            image_list = page.get_images(full=True)
            for img in image_list:
                xref = img[0]
                base_image = doc.extract_image(xref)
                image_bytes = base_image["image"]
                image = Image.open(io.BytesIO(image_bytes)).convert("RGB")
                images.append((pdf_path, page_num, image))
        doc.close()
        return chunks, images
    except Exception as e:
        print(f"Error reading {pdf_path}: {e}")
        return [], []

# 获取所有 PDF 文件的小节和图像
def get_all_sections_and_images(pdf_folder, chunk_size=1000, overlap_size=200):
    all_sections = []
    all_images = []
    pdf_files = [f for f in os.listdir(pdf_folder) if f.endswith('.pdf')]
    for pdf_file in pdf_files:
        pdf_path = os.path.join(pdf_folder, pdf_file)
        sections, images = extract_text_chunks(pdf_path, chunk_size, overlap_size)
        all_sections.extend(sections)
        all_images.extend(images)
    return all_sections, all_images

# 生成文本和图像嵌入
def generate_embeddings(sections, images):
    text_model = SentenceTransformer('all-MiniLM-L6-v2')
    clip_model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
    clip_processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")

    text_embeddings = text_model.encode([section[2] for section in sections])

    image_embeddings = []
    for _, _, image in images:
        inputs = clip_processor(images=image, return_tensors="pt")
        with torch.no_grad():
            image_features = clip_model.get_image_features(**inputs)
        image_embeddings.append(image_features.cpu().squeeze().numpy())

    return text_embeddings, image_embeddings

# 存储嵌入在数据框中
def create_embeddings_dataframe(sections, images, text_embeddings, image_embeddings):
    text_data = pd.DataFrame(sections, columns=['filename''page_num''content'])
    text_data['embedding'] = list(text_embeddings)

    image_data = pd.DataFrame(images, columns=['filename''page_num''image'])
    image_data['embedding'] = list(image_embeddings)

    return pd.concat([text_data, image_data], ignore_index=True)

# 对查询进行嵌入并计算相似度
def search(query, embeddings_df, top_k=5):
    model = SentenceTransformer('all-MiniLM-L6-v2')
    query_embedding = model.encode([query])

    embeddings = np.stack(embeddings_df['embedding'].values)
    similarities = cosine_similarity(query_embedding, embeddings)[0]
    embeddings_df['similarity'] = similarities
    top_results = embeddings_df.nlargest(top_k, 'similarity')
    return top_results

# 主函数
def main():
    pdf_folder = 'path/to/your/pdf/folder'
    sections, images = get_all_sections_and_images(pdf_folder)
    if not sections and not images:
        print("No content extracted from PDFs.")
        return

    text_embeddings, image_embeddings = generate_embeddings(sections, images)
    embeddings_df = create_embeddings_dataframe(sections, images, text_embeddings, image_embeddings)

    query = "输入你的查询"
    results = search(query, embeddings_df, top_k=5)
    print("搜索结果:\n", results)

if __name__ == "__main__":
    main()

5. 知识库问答系统 (高级)

问题:需要一个能够理解和回答关于大量技术文档的复杂问题的系统。

解决方案:基于前面的多模态搜索项目,构建一个高级的文档问答系统。

实现步骤:

  1. 在知识库中执行搜索(类似项目4)
  2. 将用户查询与前k个搜索结果结合,传递给多模态模型(如GPT-4或Llama 3.2 Vision)
  3. 使用Gradio创建一个简单的用户界面

所需库: PyMuPDF, transformers, pandas, sklearn, openai, Gradio

技能提升:通过这个项目,你将学习如何构建一个端到端的AI系统,包括后端处理和前端界面。你将深入理解检索增强生成(RAG)技术,这是当前AI应用的一个热门领域。此外,你还将学习如何创建用户友好的AI接口,这在产品化AI解决方案时非常重要。

import fitz  # PyMuPDF
import os
import pandas as pd
from sentence_transformers import SentenceTransformer
from transformers import CLIPProcessor, CLIPModel
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
from PIL import Image
import io
import torch
import openai
import gradio as gr

openai.api_key = 'YOUR_OPENAI_API_KEY'

# 提取 PDF 文档的小节和图像
def extract_text_chunks(pdf_path, chunk_size=1000, overlap_size=200):
    try:
        doc = fitz.open(pdf_path)
        chunks = []
        images = []
        for page_num in range(len(doc)):
            page = doc.load_page(page_num)
            text = page.get_text()
            start = 0
            while start < len(text):
                end = start + chunk_size
                chunk = text[start:end]
                chunks.append((pdf_path, page_num, chunk))
                start += chunk_size - overlap_size

            image_list = page.get_images(full=True)
            for img in image_list:
                xref = img[0]
                base_image = doc.extract_image(xref)
                image_bytes = base_image["image"]
                image = Image.open(io.BytesIO(image_bytes)).convert("RGB")
                images.append((pdf_path, page_num, image))
        doc.close()
        return chunks, images
    except Exception as e:
        print(f"Error reading {pdf_path}: {e}")
        return [], []

# 获取所有 PDF 文件的小节和图像
def get_all_sections_and_images(pdf_folder, chunk_size=1000, overlap_size=200):
    all_sections = []
    all_images = []
    pdf_files = [f for f in os.listdir(pdf_folder) if f.endswith('.pdf')]
    for pdf_file in pdf_files:
        pdf_path = os.path.join(pdf_folder, pdf_file)
        sections, images = extract_text_chunks(pdf_path, chunk_size, overlap_size)
        all_sections.extend(sections)
        all_images.extend(images)
    return all_sections, all_images

# 生成文本和图像嵌入
def generate_embeddings(sections, images, text_model, clip_model, clip_processor):
    text_embeddings = text_model.encode([section[2] for section in sections])

    image_embeddings = []
    for _, _, image in images:
        inputs = clip_processor(images=image, return_tensors="pt")
        with torch.no_grad():
            image_features = clip_model.get_image_features(**inputs)
        image_embeddings.append(image_features.cpu().squeeze().numpy())

    return text_embeddings, image_embeddings

# 存储嵌入在数据框中
def create_embeddings_dataframe(sections, images, text_embeddings, image_embeddings):
    text_data = pd.DataFrame(sections, columns=['filename''page_num''content'])
    text_data['embedding'] = list(text_embeddings)

    image_data = pd.DataFrame(images, columns=['filename''page_num''image'])
    image_data['embedding'] = list(image_embeddings)

    return pd.concat([text_data, image_data], ignore_index=True)

# 对查询进行嵌入并计算相似度
def search(query, embeddings_df, text_model, top_k=5):
    query_embedding = text_model.encode([query])

    embeddings = np.stack(embeddings_df['embedding'].values)
    similarities = cosine_similarity(query_embedding, embeddings)[0]
    embeddings_df['similarity'] = similarities
    top_results = embeddings_df.nlargest(top_k, 'similarity')
    return top_results

# 使用多模态模型回答问题
def answer_question(query, top_results):
    context = "\n".join(top_results['content'].values)
    prompt = f"Here is some context from technical documents:\n{context}\n\nQuestion: {query}\nAnswer:"
    response = openai.Completion.create(
        engine="text-davinci-003",
        prompt=prompt,
        max_tokens=200,
        temperature=0.5
    )
    return response.choices[0].text.strip()

# Gradio 用户界面
def generate_response(query, history):
    pdf_folder = 'path/to/your/pdf/folder'
    text_model = SentenceTransformer('all-MiniLM-L6-v2')
    clip_model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
    clip_processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")

    sections, images = get_all_sections_and_images(pdf_folder)
    if not sections and not images:
        return "No content extracted from PDFs."

    text_embeddings, image_embeddings = generate_embeddings(sections, images, text_model, clip_model, clip_processor)
    embeddings_df = create_embeddings_dataframe(sections, images, text_embeddings, image_embeddings)

    top_results = search(query, embeddings_df, text_model, top_k=5)
    answer = answer_question(query, top_results)
    return answer

demo = gr.ChatInterface(
    fn=generate_response,
    examples=[{"text""Hello""files": []}],
    title="技术文档问答系统",
    multimodal=True
)

demo.launch()

结语

通过完成这五个项目,你将全面提升你的AI技能,从基本的API使用和数据处理,到高级的多模态AI和端到端系统构建。记住,真正的学习来自于动手实践和解决实际问题。

这里有两个关键的建议来帮助你更好地学习:

  1. 从问题出发,而不是技术:解决实际问题能将你的努力放在更大的背景中,并最终产生价值。
  2. 善用AI辅助工具:使用像ChatGPT和Cursor这样的工具来提高你的编程效率。过去可能需要数小时甚至数天才能解决的问题,现在可能只需几分钟就能搞定。就比如第一个项目,在LLM之前可以算一个大工程,现在通过chatGPT或Cursor,可能不到30分钟就能完成。

选择一个项目,给自己一个周末的时间,开始你的AI技能提升之旅吧!记住,持续的实践和学习是成为AI专家的关键。如果你对任何项目有疑问,不要犹豫,勇于尝试和探索。祝你编码愉快,技能飞速提升!


读完了如果觉得不错,随手**点赞**、**在看**、**转发**三连吧,如果想第一时间收到推送,也可以给我个星标⭐~谢谢你看我的文章,下次再见。

蔡荔谈AI
AI科普 AI培训 超级个体 创业
 最新文章