这是一个全栈项目,我们拆开知识图谱+RAG,现在把学到的知识,重新组装起来!
做完了这个实践,接下来就是知识图谱作为图数据库,提供数据大底,拉上大模型,在这上面,搭建多智能体系统!
前置的完整内容,是这样的:
完整的呈现,是这样的:
查询图谱:
问答对话 LLM 后台调用知识图谱数据回答:
一、任务概述总览
本节内容,主要完成以下任务:
-
基本的环境配置
-
实现聊天引擎构建
-
基于聊天引擎实现交互界面前端。(前端使用了4个封装函数)
二、本节流程图
三、应用交互界面后端部分
环境配置与导入模块
- 功能:设置基础环境,导入所需库,配置日志记录和 I/O 编码。
# ========================== 环境配置与导入模块 ==========================import os # 操作系统相关的功能,如环境变量、文件路径等import random # 随机数生成库import sys # 访问Python解释器的某些变量及函数import logging # 日志记录库,用于输出信息到控制台或文件# 设置标准输出和输入流为UTF-8编码,以支持中文等多语言字符sys.stdout.reconfigure(encoding="utf-8")sys.stdin.reconfigure(encoding="utf-8")# 配置日志级别为INFO,并将日志输出到标准输出logging.basicConfig(stream=sys.stdout, level=logging.INFO)
配置日志记录是为了观看后台调用知识图谱的过程。INFO 以上级别的日志信息将被打印到控制台。
level=``logging.INFO
:设置日志级别为INFO
。只有INFO
级别及以上的日志信息才会被记录。logging
模块定义了多个级别的日志,按严重性递增排序为:DEBUG < INFO < WARNING < ERROR < CRITICAL
Streamlit 配置模块
- 功能:导入
Streamlit
,用于构建前端界面。将用户输入输出界面与底层逻辑连接。
# ========================== Streamlit 配置模块 ==========================import streamlit as st # Streamlit库,用于快速构建数据应用import streamlit.components.v1 as components # Streamlit的组件,可以用来嵌入自定义HTML/JS/CSS
LLM(大语言模型)和 Embedding 配置模块
- 功能:设置和配置 OpenAI LLM,用于自然语言处理。
# 配置OpenAI API客户端openai.api_key = openai_api_keyopenai.api_base = openai_api_base# 创建一个LLM实例,使用gpt-3.5-turbo模型,设置temperature=0表示响应是确定性的llm = OpenAI(temperature=0, model="gpt-3.5-turbo")# 创建一个基于OpenAI的文本嵌入模型实例embed_model = OpenAIEmbedding(model="text-embedding-ada-002")
Service Context 设置模块
- 功能:配置和创建全局服务上下文,包括 LLM 和块大小。
# ========================== Service Context 设置模块 ==========================# 根据给定的LLM和嵌入模型创建服务上下文,默认分块大小为512service_context = ServiceContext.from_defaults( llm=llm, embed_model=embed_model, chunk_size=512)# 设置全局服务上下文,以便其他Llama Index组件可以访问这个配置set_global_service_context(service_context)
此处需要注意:
day5 中是比较新版本的代码,我们设置全局语言模型和文本嵌入模型模型的方式为: Settings.llm, Settings.embed_model。
因为本节是老版本代码,我们利用 ServiceContext 和 set_global_service_context 来设置全局语言模型和文本嵌入模型。
Nebula Graph 知识图谱存储配置模块
- 功能:配置 Nebula Graph 图存储,并通过环境变量连接图数据库。
# ========================== Nebula Graph 知识图谱存储配置模块 ==========================# 设置环境变量以存储 Nebula Graph 的认证信息# 当使用 Python 客户端工具连接到 Nebula Graph 数据库时,会使用这些信息进行身份验证os.environ["NEBULA_USER"] = "root" # Nebula Graph用户名os.environ["NEBULA_PASSWORD"] = "nebula" # Nebula Graph密码os.environ["NEBULA_ADDRESS"] = "127.0.0.1:9669" # Nebula Graph数据库的地址和端口号# 配置 Nebula Graph 知识图谱的相关信息,如图空间名称、边类型、关系属性、节点标签space_name = "wukong" # 知识图谱空间名称edge_types = ["relationship"] # 定义图中关系的类型(边)rel_prop_names = ["label"] # 关系属性名称tags = ["entity"] # 定义图中实体的标签# 创建一个 NebulaGraphStore 实例,负责与 Nebula Graph 图数据库进行交互graph_store = NebulaGraphStore( space_name=space_name, # 知识图谱空间名称 edge_types=edge_types, # 定义图中关系的类型(边) rel_prop_names=rel_prop_names, # 关系属性名称 tags=tags, # 定义图中实体的标签)# 创建 StorageContext 实例,用于配置图存储上下文,包括持久化存储目录和图存储实例storage_context = StorageContext.from_defaults( graph_store=graph_store, # 使用上面定义的 NebulaGraphStore 作为图存储实例)
索引管理模块
- 功能:读取本地数据并根据这些数据生成知识图谱索引。
# ========================== 索引管理模块 ==========================try: # 尝试从持久化目录加载已存在的索引 storage_context = StorageContext.from_defaults( persist_dir="./storage_graph", # 持久化存储目录 graph_store=graph_store, # 使用前面创建的Nebula Graph存储 ) kg_index = load_index_from_storage( storage_context=storage_context, service_context=service_context, max_triplets_per_chunk=50, # 每个分块最多包含的三元组数量 space_name=space_name, edge_types=edge_types, rel_prop_names=rel_prop_names, tags=tags, verbose=True, # 输出详细信息 ) index_loaded = Trueexcept Exception as e: # 如果加载失败,打印错误并设置index_loaded为False logging.error(f"索引加载失败: {e}") index_loaded = Falseif not index_loaded: # 如果索引未成功加载,则从指定目录中的文档重建索引 documents = SimpleDirectoryReader("./data").load_data() # 读取数据目录下的文档 kg_index = KnowledgeGraphIndex.from_documents( documents, # 文档列表 storage_context=storage_context, max_triplets_per_chunk=50, service_context=service_context, space_name=space_name, edge_types=edge_types, rel_prop_names=rel_prop_names, tags=tags, include_embeddings=True, # 是否包含嵌入向量 ) # 将新创建的索引保存到持久化目录 kg_index.storage_context.persist(persist_dir="./storage_graph")
基于知识图谱构建查询引擎模块
- 功能:创建基于知识图谱的查询引擎,允许执行图数据库查询。
# ========================== 查询引擎模块 ==========================# 创建一个查询引擎,用于基于图索引执行查询kg_index_query_engine = kg_index.as_query_engine( include_text=False, # 查询结果包括原始文本内容)
聊天历史记忆模块
- 功能:通过缓冲区记录和管理聊天历史,确保多轮对话的上下文一致。
# ========================== 聊天历史记忆模块 ==========================# 创建一个 ChatMemoryBuffer 实例,用于存储聊天历史,设置最大token限制为1500memory = ChatMemoryBuffer.from_defaults(token_limit=1500)
为什么使用
ChatMemoryBuffer
跟踪对话历史:
- 使用
ChatMemoryBuffer
可以帮助系统记住之前的对话内容,这对于构建连续的对话体验非常重要。例如,在一个多轮对话中,系统可以根据之前的对话内容来更好地理解用户的意图。控制内存使用:
- 通过设置
token_limit
参数,可以有效地管理内存使用。当缓冲区达到最大容量时,旧的聊天记录会被自动删除,以确保不会占用过多的内存资源。增强对话连贯性:
- 存储对话历史可以帮助生成更连贯的回答。例如,如果用户提到之前讨论过的话题,系统可以根据历史记录来提供更准确的信息。
聊天引擎模块
- 功能:创建基于知识图谱的聊天引擎,允许用户与图数据库进行对话。
# ========================== 聊天引擎模块 ==========================# 创建聊天引擎,采用react模式处理用户请求,并且保留聊天历史chat_engine = kg_index.as_chat_engine( chat_mode="react", # 反应式聊天模式 memory=memory, # 使用上面创建的记忆缓冲区 verbose=True, # 打印详细信息)
四、应用交互界面前端部分
-
整体架构:这是一个使用
Streamlit
构建的知识图谱可视化 Demo,前端用户可以通过输入问题与后端的知识图谱交互。NebulaGraph
作为底层图数据库,负责存储和查询知识图谱数据,并将结果以交互式图形展示给用户。 -
主要组件:
-
- 前端通过
Streamlit
实现交互界面,用户可以提问并查看结果。 - 后端通过
kg_index_query_engine
查询知识图谱,并通过NebulaGraph
进行查询操作。 - 查询结果被可视化成交互式图谱,并嵌入到前端页面。
- 前端通过
#### 前端部分# """# Streamlit 页面配置# 功能:设置 Streamlit 页面的一些基本配置,如标题、图标、布局和侧边栏的初始状态。# """st.set_page_config( page_title="知识图谱课程Demo", # 设置网页标题 page_icon="🌌", # 设置网页图标 layout="centered", # 网页布局设置为居中 initial_sidebar_state="auto", # 初始侧边栏状态 menu_items=None, # 没有额外的菜单项)# """# 页面标题与描述# 功能:通过 st.title() 设置页面的标题,并用 st.info() 提供关于该平台的简要描述。# """st.title("一意AI-知识图谱课程Demo") # 设置页面的主标题st.info( "一个长期专注AI工程师培养、AI技术支撑、降本增效,始终陪伴伙伴持续成长的学习平台.", icon="📃", # 提示框中的图标)# """# 初始化聊天消息历史记录# 功能:使用 st.session_state 存储消息历史记录。st.session_state 是 Streamlit 提供的全局会话状态,用于在多次交互中保存数据。在这里用于保存聊天记录。# 如果没有 messages 键,则创建一个新的聊天记录,初始消息由助手发起。# """if "messages" not in st.session_state.keys(): # 检查是否已经有聊天记录 st.session_state.messages = [ { "role": "assistant", "content": "你可以跟我聊关于**黑神话悟空物品**", # 初始化的助手消息 } ]# """# 处理用户输入# 功能:通过 st.chat_input() 捕获用户输入,存储在 prompt 中,如果用户提交问题(prompt 非空),则将其作为新消息存储在 st.session_state.messages 中。# """if prompt := st.chat_input("提出你的问题吧"): # 等待用户的输入 st.session_state.messages.append({"role": "user", "content": prompt}) # 将用户输入添加到消息记录中# """# 调用后端的 chat_engine 进行回复# 功能:如果最后一条消息是用户的(即用户刚刚发送了一条消息),则触发助手回复。显示加载动画,调用 chat_engine.chat() 处理用户问题并显示回复,同时更新消息记录。# """if st.session_state.messages[-1]["role"] != "assistant": # 如果最后一条消息不是助手的 with st.chat_message("assistant"): with st.spinner("正在使用 NebulaGraph 进行思考"): # 显示加载动画 response = chat_engine.chat(prompt) # 调用后端的聊天引擎 st.write(response.response) # 显示返回的结果 message = {"role": "assistant", "content": response.response} # 构建助手的回复消息 st.session_state.messages.append(message) # 将助手的回复消息添加到历史记录# """# 侧边栏功能:查询操作# 功能:在侧边栏中,用户可以输入问题,点击按钮后使用 kg_index_query_engine.query() 查询知识图谱,并返回答案。# """with st.sidebar: st.markdown("## 如何工作的") # 显示侧边栏标题 prompt = st.text_input(label="输入问题", value="攻杀丹药有哪些?") # 侧边栏输入框,输入提示是“输入问题”,初始问题是“攻杀丹药有哪些?” if st.button("查询图谱 🔎"): # 查询按钮 response = kg_index_query_engine.query(prompt) # 调用知识图谱查询引擎,查询用户输入的内容 # """ # 处理查询结果 # 功能:将查询结果(即 response)转换为字符串。然后,从 response.metadata 中提取相关实体,用于构建图数据库的查询,并生成对应的 Cypher 查询语句。Cypher 是图数据库查询语言。 # """ answer_GraphRAG = str(response) # 将响应结果转换为字符串 related_entities = list( list(response.metadata.values())[0]["kg_rel_map"].keys() ) # 从响应中提取相关的实体,用于绘制子图 render_query = ( f"MATCH p=(n)-[*1..2]-() \n WHERE id(n) IN {related_entities} \nRETURN p" ) # 生成 Cypher 查询语句,用于在 NebulaGraph 中查询实体和关系 # """ # 显示 Cypher 查询语句和子图 # 功能:展示生成的 Cypher 查询语句,并将其提交给 NebulaGraph 执行查询,获取图谱结果,并转换为 DataFrame 格式。 # """ st.markdown(f"> 查询 NebulaGraph:\n```cypher\n{render_query}\n```") # 显示查询语句 st.markdown("> 检索到的子图是这样的") result = query_nebulagraph(render_query) # 执行查询,获取子图 result_df = result_to_df(result) # 将查询结果转换为 DataFrame
五、交互界面中调用的代码解析
本部分的函数为交互界面中调用的几个函数,使得可以从 NebulaGraph
中提取数据,并以图形化的方式直观地展示其节点和关系,帮助用户更好地理解和分析知识图谱中的数据结构和信息,主要包括如下几部分:
- 查询 NebulaGraph:通过
query_nebulagraph()
函数执行 Cypher 查询,获取知识图谱中的数据。 - 数据转换:使用
result_to_df()
将查询结果转换为pandas.DataFrame
,方便后续的数据处理和可视化。 - 图形化展示:利用
Pyvis
库和create_pyvis_graph()
函数,将查询结果绘制成交互式图表,并通过render_pd_item()
函数将各个节点和关系动态添加到图中,实现对知识图谱的直观展示和交互操作。
1.query_nebulagraph
函数
-
功能:该函数用于执行对
NebulaGraph
的查询操作。 -
参数:
-
query
:要执行的 Cypher 查询语句。space_name
:NebulaGraph 的命名空间(类似于数据库的概念)。address
:NebulaGraph 服务的 IP 地址,默认为127.0.0.1
(本地)。port
:服务的端口号,默认9669
。user
和password
:用于登录 NebulaGraph 的凭证。
-
返回值:执行 Cypher 查询语句后返回的查询结果。
-
核心点:
-
- 通过会话池 (
SessionPool
) 来与NebulaGraph
建立连接并执行查询。 - 配置参数是连接到数据库的关键信息,尤其是
space_name
和address
。
- 通过会话池 (
def query_nebulagraph( query, space_name=space_name, # NebulaGraph 数据库的命名空间 address="127.0.0.1", # NebulaGraph 服务器的地址 (默认是本地) port=9669, # NebulaGraph 服务的端口号 user="root", # 访问 NebulaGraph 的用户名 password="nebula", # 访问 NebulaGraph 的密码): # 配置 NebulaGraph 会话池 config = SessionPoolConfig() session_pool = SessionPool(user, password, space_name, [(address, port)]) # 连接到 NebulaGraph 数据库 session_pool.init(config) # 初始化会话池 return session_pool.execute(query) # 执行查询,并返回查询结果
**result_to_df
**函数
-
功能:将 NebulaGraph 查询结果转换为
pandas.DataFrame
以便后续操作。 -
参数:
result
是 NebulaGraph 返回的查询结果对象。 -
返回值:一个
pandas.DataFrame
对象,用于后续的数据处理和可视化。 -
核心点:
-
- 将 NebulaGraph 查询结果中的每一列提取出来,并转换为 Python 原生数据类型。
- 最终使用
pandas.DataFrame
将结果格式化为表格结构,方便后续操作或可视化。
def result_to_df(result): from typing import Dict import pandas as pd columns = result.keys() # 获取查询结果的列名 d: Dict[str, list] = {} for col_num in range(result.col_size()): # 遍历每一列 col_name = columns[col_num] # 获取列名 col_list = result.column_values(col_name) # 获取列对应的值 d[col_name] = [x.cast() for x in col_list] # 将列值转换为 Python 原生类型 return pd.DataFrame(d) # 将数据转换为 pandas DataFrame
create_pyvis_graph
函数
-
功能:使用
Pyvis
绘制一个交互式的有向图网络,展示查询结果。 -
参数:
result_df
是查询结果的DataFrame
,其中包含了节点和关系的数据。 -
返回值:一个
Pyvis
的网络图对象。 -
核心点:
-
- 使用
Pyvis
绘制图形,调整图的物理参数,如节点之间的距离、中心引力等,以确保图表显示效果良好。 render_pd_item
用于处理result_df
中的每一个节点或关系,详见下文。
- 使用
def create_pyvis_graph(result_df): from pyvis.network import Network # 去除 DataFrame 中的重复项 result_df = result_df.drop_duplicates() # 设置图的基本参数,包括尺寸、布局方式、是否是有向图等 g = Nork( notebook=True, # 在 notebook 环境中显示图 directed=True, # 设置为有向图 cdn_resources="in_line", # 使用内联资源(而非外部资源) ="500px", # 图表高度 = "100%", # 图表宽度 ) # 初始化一个集合来存储已有的边 existing_edges = set() # 遍历 DataFrame 的每一行,将其中的元素添加到图表中 for _, row in result_df.iterrows(): for item in row: render_pd_item(g, item, existing_edges) # 处理每一个元素,并将其添加到图中
render_pd_item
函数
-
功能:根据不同的元素类型(节点、关系、路径等)将其添加到 PyVis 图对象
g
中。 -
参数:
-
g
:PyVis 图对象,用于展示节点和关系。item
:待处理的元素,可能是节点(Node)、关系(Relationship)、路径(PathWrapper)或列表(list)。
-
主要处理:
-
- 节点(Node):提取节点 ID、标签、属性,添加到图中。
- 关系(Relationship):提取关系的起点、终点、名称和属性,添加到图中,并确保相关的节点存在。
- 路径(PathWrapper):递归地处理路径中的节点和关系。
- 列表(list):如果
item
是列表,则递归处理其中的每一个元素。
-
核心点:
-
- 支持对
NebulaGraph
返回的数据进行递归处理,能够处理复杂的路径、关系网络,并将其动态添加到Pyvis
图中。 - 通过递归调用函数,处理
Node
、Relationship
和PathWrapper
等不同的数据类型,确保所有元素都正确地展示在图中。
- 支持对
def render_pd_item(g, item, existing_edges): from nebula3.data.DataObject import Node, PathWrapper, Relationship, ValueWrapper # 定义一个辅助函数来处理 NebulaGraph 的 ValueWrapper 对象 def unwrap(value): if isinstance(value, ValueWrapper): # 如果 value 是 ValueWrapper 类型,则将其转换为原生 Python 类型 return value.cast() # 否则直接返回 value return value # 检查 item 是否是 Node 类型 if isinstance(item, Node): # 获取节点 ID 并进行解包(如果需要) node_id = unwrap(item.get_id()) # 获取节点的所有标签 tags = item.tags() # 初始化一个空字典来存储节点属性 props = dict() # 遍历每个标签,并将该标签下的所有属性添加到 props 字典中 for tag in tags: props.update({k: unwrap(v) for k, v in item.properties(tag).items()}) # 将节点添加到图 g 中,设置节点的标签和标题(包含属性信息) g.add_node(node_id, label=node_id, title=str(props)) # 检查 item 是否是 Relationship 类型 elif isinstance(item, Relationship): # 获取关系的起始节点 ID 并进行解包(如果需要) src_id = unwrap(item.start_vertex_id()) # 获取关系的终止节点 ID 并进行解包(如果需要) dst_id = unwrap(item.end_vertex_id()) # 获取关系的名称并进行解包(如果需要) edge_name = unwrap(item.edge_name()) # 获取关系的所有属性并进行解包(如果需要) props = {k: unwrap(v) for k, v in item.properties().items()} # 从属性中提取 'label' 属性作为边的显示标签,如果不存在则使用关系名称 label = props.get("label", edge_name) # 确保起始顶点和结束顶点在图中存在,如果不存在则添加这些节点 if not src_id in g.node_ids: g.add_node(src_id) if not dst_id in g.node_ids: g.add_node(dst_id) # 创建一个唯一标识符来表示这条边,包括源节点 ID、目标节点 ID 和属性字符串 edge_key = (src_id, dst_id, str(props)) # 检查是否已经存在相同的边 if edge_key not in existing_edges: # 如果边不存在,则添加这条边到图中,并设置边的标签和标题(包含属性信息) g.add_edge(src_id, dst_id, label=label, title=str(props)) # 将这个边的唯一标识符添加到 existing_edges 集合中,以防止未来的重复添加 existing_edges.add(edge_key)
六、完整代码及操作说明
- 注意:day6 和 day5 代码版本不一样,需要新建 conda 环境。
- 注意:最开始运行出现下面图片中的索引加载失败属于正常现象,此时会首先建立索引并存储到本地,因此需要稍等1-2分钟,才可刷出网页端画面,后续重新启动该程序,则无需太久等候,很快便可以刷出网页端界面。
-
文件放置结构如下:
.├── data│ ├── 九叶灵芝草(上品).txt│ ├── 交梨(上品).txt│ └── ...├── requirements.txt├── environment.yml└── graph_rag_chatbot.py
-
配置环境及依赖(选择 environment.yml 或者 requirements.txt 其中一种即可)
-
- 利用 conda 创建
wukong2
环境: - 激活运行项目的
wukong2
环境(换成你自己的环境名称): - 在
wukong2
环境中,利用requirements.txt
文件安装项目依赖:
- 利用 conda 创建
# 创建名为 wukong2 的新环境,Python 版本为 3.10(可以根据需求更改)conda create -n wukong2 python=3.10# 激活名为 wukong 的新环境conda activate wukong2# 使用清华大学 PyPI 镜像源安装依赖pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple*
*
运行环境文件 environment.yml
如下,下载到本地使用,windows 利用 environment.yml 创建新环境可能会有问题请用 requirements.txt 方式配置环境依赖,ubuntu 直接能用这种方式:
马上,我们就开始多智能体系统的0-1了!
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。