AI大模型应用开发
本文介绍了AI大模型应用开发的基础内容,包括Ollama安装Deepseek模型、Prompt提示词工程和Loader文档加载器三部分。首先详细说明了Windows环境下安装Ollama及Deepseek模型的步骤,包括C++编译环境配置、Rust加速安装和Deepseek模型部署。其次讲解了Prompt提示词的多种定义方式,包括通过ChatPromptTemplate创建消息模板的不同方法。最后
·
AI大模型应用开发【基础内容】
声明:本人AI新手一枚,文章中有不足之处也请大家多多指教~
说明:文章采用的大模型为阿里通义千问大模型请自行更改ApiKey,Milvus向量数据库地址也需自行更改。
一、Ollama安装Deepseek
1. 安装C/C++编译环境
# 安装完整的 C/C++ 编译环境
1、下载并安装 Visual Studio 2022
2、安装时勾选 “使用 C++ 的桌面开发” 工作负载,并确保勾选以下组件:
• MSVC v143 - VS 2022 C++ 生成工具
• Windows 10/11 SDK
• C++ 核心功能
3、完成安装后重启计算机
参考文章:https://blog.csdn.net/qq_53325717/article/details/146180816
# Rust安装加速
# 在rustup-init.exe程序文件夹下使用PowerShell中输入两行代码:
$ENV:RUSTUP_DIST_SERVER='https://mirrors.ustc.edu.cn/rust-static'
$ENV:RUSTUP_UPDATE_ROOT='https://mirrors.ustc.edu.cn/rust-static/rustup'
参考文章:https://blog.csdn.net/qq_20288327/article/details/143868544
# Rust安装
参考文章:https://blog.csdn.net/m0_74825093/article/details/145656819
2. Windows安装ollama
# #Windows安装ollama
.\OllamaSetup.exe /DIR=D:\develop\Ollama
# 查看版本信息
ollama --version
# 配置环境变量-指定模型自定义下载路径--重启电脑后生效
OLLAMA_MODELS=D:\develop\Ollama\Models
# 配置环境变量-指定开放外部访问
OLLAMA_HOST=0.0.0.0
OLLAMA_ORIGINS=*
# 参考文章
https://blog.csdn.net/fx_yzjy101/article/details/145834111
https://chatboxai.app/zh/help-center/connect-chatbox-remote-ollama-service-guide
3. Ollama安装Deepseek
#部署deepseek 7b
ollama run deepseek-r1:7b
#部署14b
ollama run deepseek-r1:14b
#列出已安装的模型
ollama list
二、Prompt提示词工程
1. 常见LLM调用Prompt提示词
# 定义提示词模板
prompt = ChatPromptTemplate.from_template("回答这个问题:{question}")
# 定义模型
model = ChatOpenAI(
model_name="qwen-plus",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key="sk-2b96527d111f492d",
temperature=0.7)
# 创建输出解析器
parser = StrOutputParser()
# 构建 LCEL 链
chain = prompt | model | parser
# 调用
result = chain.invoke({"question": "如何学习AI大模型?"})
print(result)
2. 定义Prompt提示词的几种方式
# 定义模型
model = ChatOpenAI(...)
# 通过ChatPromptTemplate创建list[BaseMessage]
# 方式一:
chat_template = ChatPromptTemplate.from_messages([
("system", "你是一个AI助手,名字是{name}。"),
("human", "{user_input}")
])
# messages类型:list[BaseMessage]
# BaseMessage类型:SystemMessage, HumanMessage, AIMessage, ToolMessage
messages = chat_template.format_messages(
name="Bob",
user_input="你最喜欢的编程语言是什么?"
)
# 方式二:
system_template = SystemMessagePromptTemplate.from_template("你是一个AI助手,名字是{name}。")
human_template = HumanMessagePromptTemplate.from_template("{user_input}")
chat_template = ChatPromptTemplate.from_messages([
system_template,
human_template
])
messages = chat_template.format_messages(
name="Bob",
user_input="你最喜欢的编程语言是什么?"
)
# 方式三:
messages = [
SystemMessage(content="你是一个AI助手,名字是{name}。"),
HumanMessage(content="{user_input}")
]
# 输出结果:
print(messages)
# SystemMessage(content='你是一个AI助手,名字是Bob。')
# HumanMessage(content='你最喜欢的编程语言是什么?')
# 执行模型调用
# response类型:BaseMessage(具体是AIMessage)
response = model.invoke(messages)
# 定义模型
model = ChatOpenAI(...)
# 方式四:
# prompt_template类型:ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_template("回答这个问题:{question}")
# prompt_result类型:PromptValue
prompt_result = prompt_template.invoke({"question": "如何学习AI大模型?"})
# messages类型:list[BaseMessage]
messages = prompt_result.to_messages()
# 输出结果:
print(messages)
# [HumanMessage(content='回答这个问题:如何学习AI大模型?')]
# 执行模型调用
# response类型:BaseMessage(具体是AIMessage)
# model.invoke(PromptValue类型/list[BaseMessage]类型)
response = model.invoke(prompt_template)
response = model.invoke(messages)
三、Loader文档加载器
1. TextLoader加载文本文件
from langchain_community.document_loaders import TextLoader
loader = TextLoader("data/test.txt", encoding="utf-8")
documents = loader.load()
2. CSVLoader加载 CSV 文件
from langchain_community.document_loaders import CSVLoader
loader = TextLoader("data/test.txt", encoding="utf-8")
documents = loader.load()
3. JSONLoader加载 JSON 文件
from langchain_community.document_loaders import JSONLoader
loader = JSONLoader(
file_path="data/test.json",
jq_schema=".articles[]", # 提取 articles 数组中的每个元素
content_key="content" # 指定 content 字段作为文本内容
)
documents = loader.load()
4. Loader加载PDF文档里面的图片
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("data/pdf-img.pdf", extract_images=True)
documents = loader.load()
for doc in documents:
print(doc.metadata)
print(doc.page_content)
print("**"*10)
5. Loader批量加载多个网页
from langchain_community.document_loaders import WebBaseLoader
# 代码中设置USER_AGENT, 注意设置USER_AGENT的代码一定要放在WebBaseLoader 这个包前面,不然还是会报错
os.environ['USER_AGENT'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
# 初始化加载器,传入目标URL列表(可多个)
urls = [
"https://news.baidu.com/", # 新闻
"https://tieba.baidu.com/index.html" # 贴吧
]
loader = WebBaseLoader(urls)
documents = loader.load()
print(f"共加载 {len(documents)} 个文档")
for doc in documents:
print(doc.metadata)
print(doc.page_content)
print("**"*10)
四、自定义嵌入模型
1. Ollama安装嵌入模型
# 下载嵌入模型
ollama run mofanke/acge_text_embedding
# 嵌入模型请求测试
curl http://localhost:11434/api/embeddings -d '{"model": "mofanke/acge_text_embedding", "prompt": "小帅AI大模型课程"}'
# 后台启动服务(默认端口11434)
# ollama serve &
# 查看运行的模型
ollama ps
2. Python自定义嵌入模型
from typing import List, Optional
from langchain.embeddings.base import Embeddings
import requests
class OllamaEmbeddings(Embeddings):
def __init__(self, model: str = "llama2", base_url: str = "http://localhost:11434"):
self.model = model
self.base_url = base_url
def _embed(self, text: str) -> List[float]:
try:
response = requests.post(
f"{self.base_url}/api/embeddings",
json={
"model": self.model,
"prompt": text # 注意:某些模型可能需要调整参数名(如"prompt"或"text")
}
)
response.raise_for_status()
return response.json().get("embedding", [])
except Exception as e:
raise ValueError(f"Ollama embedding error: {str(e)}")
def embed_query(self, text: str) -> List[float]:
return self._embed(text)
def embed_documents(self, texts: List[str]) -> List[List[float]]:
return [self._embed(text) for text in texts]
embeddings = OllamaEmbeddings(
model="mofanke/acge_text_embedding",
base_url="http://localhost:11434"
)
# 分析商品评论情感倾向
comments = [
"衣服质量很好,但是物流太慢了",
"性价比超高,会回购!",
"尺寸偏小,建议买大一号"
]
# 生成嵌入向量
embeddings = embeddings.embed_documents(comments)
print(embeddings)
print(len(embeddings)) # 3
print(len(embeddings[0])) # 1024
五、构建RAG知识库
1. 整体流程
一、RAG数据落库部分:
1、根据文档类型调用对应的Loader加载器(目前采用读取本地txt文档)
2、初始化文本分割器对导入的文本数据进行分割。
3、初始化嵌入模型对切割后的文本数据生成其向量值。
4、初始化Milvus向量数据库指定连接地址和数据库,将生成的向量值存入向量库中。
二、RAG检索部分:
方式一:
1、用户提问
2、调用多查询检索器根据用户提出的问题生成多个相似的提问方式
3、定义嵌入模型根据用户提出的问题生成对应的向量值
4、定义向量数据库和检索器检索算法(mmr:最大边际相关算法、similarity:相似性搜索)
5、定义Prompt提示词模板,通过LangChain链式调用传递检索结果、用户问题获取回答结果
方式二:
1、定义实时搜索工具、向量数据库检索工具
2、创建ReAct智能体、Agent执行器
3、通过Agent执行器调用对用户提问进行推理、思考、行动、观察后得到结果
(重点)附:可增加Redis缓存,使用UserId作为缓存唯一KEY,存储每一次的对话历史,
将聊天历史通过大模型生成简易的摘要信息,在Prompt提示词模板中传入摘要信息,
便可以让智能体记住用户之前的聊天历史。
2. RAG数据落库部分
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_milvus import Milvus
from langchain_openai import ChatOpenAI
from langchain_community.document_loaders import TextLoader
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.schema.runnable import RunnablePassthrough
from langchain.prompts import PromptTemplate
# ==========RAG数据落库部分===========
# 使用TextLoader加载文本数据
loader = TextLoader(file_path="./data/qa.txt", encoding="utf-8")
# 加载数据到变量中
data = loader.load()
# 初始化文本分割器,将文本分割成小块
# chunk_size:每个块的最大大小
# chunk_overlap:块与块之间重叠部分的大小
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=100, chunk_overlap=10)
# 执行文本分割
splits_data = text_splitter.split_documents(data)
# 初始化嵌入模型
embeddings = DashScopeEmbeddings(
model="text-embedding-v2", # 第二代通用模型
max_retries=3,
dashscope_api_key="sk-2b96527d111f492d"
)
# 初始化向量数据库
vector_store = Milvus.from_documents(
documents=splits_data,
embedding=embeddings,
collection_name="develop_milvus",
connection_args={"uri": "http://112.74.1.210:19530"}
)
3.1. RAG查询部分(方式一)
特点:直接触发检索Milvus向量数据库,将检索结果和问题一同放到Prompt提示词模板中。
from langchain_community.embeddings import DashScopeEmbeddings
from langchain_milvus import Milvus
from langchain_openai import ChatOpenAI
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain.schema.runnable import RunnablePassthrough
from langchain.prompts import PromptTemplate
import os
import logging
# 设置日志记录的基本配置
logging.basicConfig()
# 设置多查询检索器的日志记录级别为INFO
logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "lsv2_pt_b9383d0bddd74a6db102b"
os.environ["LANGSMITH_ENDPOINT"] = "https://api.smith.langchain.com"
os.environ["LANGSMITH_PROJECT"] = "proejct_search_v1"
# 初始化嵌入模型
embeddings = DashScopeEmbeddings(
model="text-embedding-v2", # 第二代通用模型
max_retries=3,
dashscope_api_key="sk-2b96527d111f492d"
)
# 初始化向量数据库
vector_store = Milvus(
embeddings,
connection_args={"uri": "http://112.74.1.210:19530"},
collection_name='develop_milvus',
)
# 定义问题
question = "小帅帅不知道为啥腿抽筋了"
# 初始化模型
llm = ChatOpenAI(
model_name="qwen-plus",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key="sk-2b96527d111f492d",
temperature=0.7)
# MMR推荐(跨类搭配)
diverse_results = vector_store.as_retriever(
search_type="mmr",
search_kwargs={"k": 2, "fetch_k": 10, "lambda_mult": 0.4}
)
# 从语言模型中创建多查询检索器
retriever_from_llm = MultiQueryRetriever.from_llm(
diverse_results, llm=llm)
# 定义PromptTemplate,用于构建输入给LLM的prompt。
template = """你是AI文档助手,使用以下上下文来回答最后的问题。
如果你不知道答案,就说你不知道,不要试图编造答案。
最多使用10句话,并尽可能简洁地回答。总是在答案的末尾说“谢谢你的提问!”.
{context}
问题: {question}
"""
rag_prompt = PromptTemplate.from_template(template)
# 构建Retrieval-Augmented Generation链。
# 使用检索器执行问题检索
rag_chain = (
{"context": retriever_from_llm, "question": RunnablePassthrough()}
| rag_prompt
| llm
)
# 调用rag_chain回答问题。
result = rag_chain.invoke(question)
print(result.content)
3.2. RAG查询部分(方式二)
特点:提前定义检索Milvus向量数据库的工具 ,只有触发相关的关键词搜索时,才会调用工具进行检索。
from langchain_community.utilities import SearchApiAPIWrapper
from langchain_core.tools import tool
from langchain.agents import AgentExecutor, create_react_agent
from langchain.tools.retriever import create_retriever_tool
from langchain_milvus import Milvus
from langchain.prompts import PromptTemplate
from langchain.embeddings import DashScopeEmbeddings, CacheBackedEmbeddings
from langchain_openai import ChatOpenAI
from langchain.retrievers.multi_query import MultiQueryRetriever
# 初始化模型和缓存
from langchain.storage import LocalFileStore
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = "lsv2_pt_b9383d0bddd74a6db102b"
os.environ["LANGSMITH_ENDPOINT"] = "https://api.smith.langchain.com"
os.environ["LANGSMITH_PROJECT"] = "proejct_search_v2"
# 配置搜索工具
os.environ["SEARCHAPI_API_KEY"] = "8pk8usoTXht7TD"
search = SearchApiAPIWrapper()
@tool("web_search")
def web_search(query: str) -> str:
"""当需要获取实时信息、最新事件或未知领域知识时使用,输入应为搜索关键词"""
try:
results = search.results(query) # 获取前3条结果
return "\n\n".join([
f"来源:{res['title']}\n内容:{res['snippet']}"
for res in results['organic_results']
])
except Exception as e:
return f"搜索失败:{str(e)}"
# 初始化嵌入模型
embeddings = DashScopeEmbeddings(
model="text-embedding-v2", # 第二代通用模型
max_retries=3,
dashscope_api_key="sk-2b96527d111f492d"
)
# 本地缓存目录
storage = LocalFileStore("./embedding_cache/")
# 初始化缓存装饰器
cached_embeddings = CacheBackedEmbeddings.from_bytes_store(
embeddings,
storage,
namespace="openai_project_emb" # 命名空间隔离不同模型
)
# 初始化向量数据库
vector_store = Milvus(
cached_embeddings,
connection_args={"uri": "http://112.74.1.210:19530"},
collection_name='develop_milvus',
)
# 初始化大模型
llm = ChatOpenAI(
model_name="qwen-plus",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key="sk-2b96527d111f492d",
temperature=0.7
)
# MMR推荐(跨类搭配)
diverse_results = vector_store.as_retriever(
search_type="mmr",
search_kwargs={"k": 2, "fetch_k": 10, "lambda_mult": 0.4}
)
# 从语言模型中创建多查询检索器
retriever_from_llm = MultiQueryRetriever.from_llm(
diverse_results, llm=llm)
# 创建检索器工具
retriever_tool = create_retriever_tool(
retriever_from_llm,
"milvus_retriever",
"搜索有关 小帅帅 的信息。对于任何有关 小帅帅 的问题,你必须使用这个工具!",
)
# 定义工具列表
tools = [web_search, retriever_tool]
# 模板内容示例:
template = """
Answer the following questions as best you can. You have access to the following tools:
{tools}
Use the following format:
Question: the input question you must answer
Thought: you should always think about what to do
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
... (this Thought/Action/Action Input/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question
Begin!
Question: {input}
Thought:{agent_scratchpad}
"""
prompt = PromptTemplate.from_template(template)
# 创建ReAct智能体
agent = create_react_agent(llm, tools, prompt)
# 创建Agent执行器
agent_executor = AgentExecutor(agent=agent,
tools=tools,
verbose=True,
handle_parsing_errors=True,
return_intermediate_steps=True)
def run_question(question: str):
print(f"\n问题:{question}")
result = agent_executor.invoke({"input": question})
print(f"\n答案:{result['output']}\n{'='*50}")
run_question(
"中文回答下面3个问题:第一个:小帅帅不知道为啥抽筋了?; 第二个:现在的日期是几号;第三个:腾讯的股价是多少")
六、大模型学习路线推荐
1、Python基础(包括多线程async for/await/yield的使用等)
2、Pydantic类库
3、Ollama私有化部署Deepseek、Embeddings嵌入模型
#### 以下全部针对Langchain框架 ####
4、Prompt提示词工程
5、Loader加载器
6、RecursiveCharacterTextSplitter文本切割
7、DashScopeEmbeddings嵌入模型
8、Milvus向量数据库
9、BaseTool工具使用
10、CoT思维链、ReAct智能体
11、会话历史记录、摘要生成
12、AutoGL大模型微调训练
13、MCP协议
七、Python学习推荐文章
Python 并发B站视频:https://www.bilibili.com/video/BV13d4y167r2?spm_id_from=333.788.videopod.episodes&vd_source=6905191dd4af7aedb27c3ae47e51f796&p=78
Python 官网教程:https://www.runoob.com/python3/python-spider-beautifulsoup.html
Python 并发编程:https://zhuanlan.zhihu.com/p/712104829
Python yield字段:https://blog.csdn.net/xiaodoudouer/article/details/143902063
Python __name__ 变量含义:https://www.cnblogs.com/geekbruce/articles/18280650
Python with语句:https://blog.csdn.net/zhaoxilengfeng/article/details/144382104
Python AsyncIterator对象:https://blog.csdn.net/engchina/article/details/141302810
AsyncGenerator和AsyncContextManager:https://cloud.tencent.com/developer/information/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8AsyncGenerator%E5%92%8CAsyncContextManager%E6%AD%A3%E7%A1%AE%E6%8C%87%E5%AE%9A%E7%B1%BB%E5%9E%8B%E6%8F%90%E7%A4%BA
Python BaseSettings:https://blog.csdn.net/footless_bird/article/details/134183693
Python Requests类库:
Python 解析URL:https://blog.csdn.net/2501_91227845/article/details/146811536
Python BytesIO:https://blog.csdn.net/zengliguang/article/details/138045711
Python 如何获取响应headers:https://docs.pingcode.com/ask/994363.html
Python iter_content()方法详解:https://blog.csdn.net/Htojk/article/details/136633666
Python tqdm:https://blog.csdn.net/weixin_41238626/article/details/147063664
Python pypdf库:https://blog.csdn.net/u013172930/article/details/147711398
Python sub函数:https://blog.51cto.com/u_16213300/13143645
Python beautifulsoup:https://www.runoob.com/python3/python-spider-beautifulsoup.html
Python beautifulsoup:https://blog.csdn.net/qq_56109699/article/details/147365996
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)