大模型入门实战:VisualGLM 图文生成与 RAG 知识库问答
本文介绍了大模型学习的三个进阶阶段。第一阶段通过 VisualGLM 实现图文转换,涵盖环境搭建、模型加载及图生文代码实现。第二阶段基于文心大模型与 LangChain 框架,详解 RAG 架构下的金融知识库问答,包括文档解析、向量化、FAISS 检索及 API 调用封装。第三阶段推荐多模态、医疗 AI 及数字人等综合项目。文章补充了核心技术解析、常见问题排查及后续学习路径,帮助读者系统掌握大模型应用开发技能。

本文介绍了大模型学习的三个进阶阶段。第一阶段通过 VisualGLM 实现图文转换,涵盖环境搭建、模型加载及图生文代码实现。第二阶段基于文心大模型与 LangChain 框架,详解 RAG 架构下的金融知识库问答,包括文档解析、向量化、FAISS 检索及 API 调用封装。第三阶段推荐多模态、医疗 AI 及数字人等综合项目。文章补充了核心技术解析、常见问题排查及后续学习路径,帮助读者系统掌握大模型应用开发技能。

本文依托主流 AI 开发平台内容,整理了一套从入门到进阶的大模型实践方案。章节一呈现了一个入门级 Demo(小白友好),以 VisualGLM(多模态大模型)为例实现图生文;章节二呈现了一个进阶版 Demo(适合有一定 LLM 基础的人群),以文心大模型(LLM+RAG)为例实现金融问答;章节三推荐了数个综合级、系统化的项目(适合从事或预从事 LLM/AIGC 岗位的人群),把每个项目深挖吃透后,基本可以胜任相关岗位。
使用 git 命令从 GitHub 下载 visualglm-6b 模型到本地,安装 PaddleMIX 及 pip 其他相关依赖包。
!git clone https://github.com/PaddlePaddle/PaddleMIX.git
!pip install soundfile librosa paddlepaddle-gpu
注意:请确保已安装 CUDA 环境并配置好 GPU 驱动。
加载预训练模型和处理器,设置环境变量以优化显存管理。
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
os.environ["FLAGS_use_cuda_managed_memory"] = "true"
import requests
from PIL import Image
from PaddleMIX.paddlemix import VisualGLMForConditionalGeneration, VisualGLMProcessor
import warnings
warnings.filterwarnings('ignore')
# 设置 visualglm-6b 预训练模型的本地路径
pretrained_name_or_path = "./visualglm-6b"
model = VisualGLMForConditionalGeneration.from_pretrained(pretrained_name_or_path, dtype="float32")
model.eval()
processor = VisualGLMProcessor.from_pretrained(pretrained_name_or_path)
通过 URL 获取图片并进行预处理。
url = 'https://i02piccdn.sogoucdn.com/5dd40dedd7107cc5'
image = Image.open(requests.get(url, stream=True).raw)
# 配置模型参数
generate_kwargs = {
"max_length": 1024,
"min_length": 10,
"num_beams": 1,
"top_p": 1.0,
"top_k": 1,
"repetition_penalty": 1.2,
"temperature": 0.8,
"decode_strategy": "sampling",
"eos_token_id": processor.tokenizer.eos_token_id,
}
输入提示词,让模型根据图片内容生成描述文本。
query = "写诗描述一下这个场景"
history = []
inputs = processor(image, query)
generate_ids, _ = model.generate(**inputs, **generate_kwargs)
responses = processor.get_responses(generate_ids)
history.append([query, responses[0]])
print(responses)
进行多轮对话,询问图片中的具体细节。
query = "这部电影的导演是谁?"
inputs = processor(image, query, history=history)
generate_ids, _ = model.generate(**inputs, **generate_kwargs)
responses = processor.get_responses(generate_ids)
history.append([query, responses[0]])
print(responses)
本部分演示如何使用 LangChain 框架结合向量数据库构建 RAG(检索增强生成)系统。
![整体流程示意图]
下载示例文档并安装必要的 Python 库。
# (1)下载 PDF 文档
!wget https://zihao-code.obs.cn-east-3.myhuaweicloud.com/20230709-langchain/carbon.pdf
!wget https://zihao-code.obs.cn-east-3.myhuaweicloud.com/20230709-langchain/car.pdf
# (2)安装依赖环境
!pip install transformers langchain openai unstructured tiktoken faiss-cpu sentence-transformers pypdf
加载 PDF 文件并提取文本内容。
from langchain.document_loaders import PyPDFLoader
loaders = [
PyPDFLoader('car.pdf'),
PyPDFLoader('carbon.pdf')
]
docs = []
for loader in loaders:
docs.extend(loader.load())
将长文档切分为适合模型处理的片段。
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=30, separator='\n')
splits = text_splitter.split_documents(docs)
print(f'切分后的文档数量:{len(splits)}')
使用嵌入模型将文本转换为向量表示。
from langchain.embeddings import HuggingFaceEmbeddings
embedding_model = 'moka-ai/m3e-base'
embeddings = HuggingFaceEmbeddings(model_name=embedding_model)
构建知识库文本 - 向量数据库,支持快速检索。
from langchain.vectorstores import FAISS
vector_store = FAISS.from_documents(splits, embeddings)
针对用户问题进行相似性搜索,从知识向量库中检索最相似的 TOP K 个 Chunk。
query = '政府发布了哪些双碳政策文件'
K = 5
# 注意:变量名需统一,此处修正为 query
docs_and_scores = vector_store.similarity_search_with_score(query, k=K)
# 打印 TOP K Chunk 的来源、字数、和 query 相似度打分
for doc, score in docs_and_scores:
source = doc.metadata['source']
content = doc.page_content
print(f'来源:{source}, 字数:{len(content)}, 相似度打分:{score}')
print(content[:30]+'......')
print('————————————————————————————————————')
将检索到的上下文拼接,构造发送给大模型的提示词。
context = ''
for doc, score in docs_and_scores:
context += doc[0].page_content if isinstance(doc, tuple) else doc.page_content
context += '\n'
prompt = f'''你是一个学习助手,请根据下面的已知信息回答问题,你只需要回答和已知信息相关的问题,如果问题和已知信息不相关,你可以直接回答'不知道'。
问题:{query}
已知信息:{context}'''
封装百度文心一言 API 调用逻辑。
import requests
class BaiduErnie:
host: str = "https://aip.baidubce.com"
client_id: str = "" # 替换为您的 Client ID
client_secret: str = "" # 替换为您的 Client Secret
access_token: str = ""
def __init__(self, client_id: str, client_secret: str):
self.client_id = client_id
self.client_secret = client_secret
self.get_access_token()
def get_access_token(self) -> str:
url = f"{self.host}/oauth/2.0/token?grant_type=client_credentials&client_id={self.client_id}&client_secret={self.client_secret}"
response = requests.get(url)
if response.status_code == 200:
self.access_token = response.json()["access_token"]
return self.access_token
else:
raise Exception("获取 access_token 失败")
def chat(self, messages: list, user_id: str) -> tuple:
if not self.access_token:
self.get_access_token()
url = f"{self.host}/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token={self.access_token}"
data = {"messages": messages, "user_id": user_id}
response = requests.post(url, json=data)
if response.status_code == 200:
resp = response.json()
return resp["result"], resp
else:
raise Exception("请求失败")
# 填入文心大模型后台的 API 信息
client_id = "" # 自己的 client_id
client_secret = "" # 自己的 client_secret
user_id = "" # 自己的 user_id
baidu_ernie = BaiduErnie(client_id, client_secret)
def chat(prompt):
messages = []
messages.append({"role": "user", "content": prompt})
result, response = baidu_ernie.chat(messages, user_id)
return result
result = chat('你是哪家公司开发的什么大语言模型?')
print(result)
将提示词 Prompt 输入给文心大模型,获得输出结果。
def predict(query):
docs_and_scores = vector_store.similarity_search_with_score(query, k=K)
context = ''
for doc, score in docs_and_scores:
context += doc[0].page_content if isinstance(doc, tuple) else doc.page_content
context += '\n'
prompt = '你是一个学习助手,请根据下面的已知信息回答问题,你只需要回答和已知信息相关的问题,如果问题和已知信息不相关,你可以直接回答'不知道' 问题:{} 已知信息:{}'.format(query, context)
# 输入文心大模型
result = chat(prompt)
print(result)
predict('政府发布了哪些双碳政策文件')
# 输出示例:根据政府发布的信息,中国提出了 30·60'双碳'目标,并发布了《关于完整准确全面贯彻新发展理念做好碳达峰碳中和工作的意见》等纲领性文件...
为了进一步提升能力,建议尝试以下综合性项目:
batch_size 或使用量化版本模型。encoding='utf-8'。注:本文档旨在提供技术参考,实际项目中请根据业务需求调整架构与参数。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online