【ollama】基础使用
发布时间:2026/11/5 5:34:15 锦皓数字建站

【ollama】基础使用如何设置模型参数ollama的webui界面需要设置的本地环境变量如何创建模型模型量化和精度本地的rag案例入库代码查询代码如何设置模型参数命令行/set parameter num_ctx 4096ollama的webui界面https://github.com/ollama-webui/ollama-webui-lite/tree/main ui界面需要设置的本地环境变量OLLAMA_NO_CLOUD 1OLLAMA_HOST 0000OLLAMA_KEEP_ALIVE -1OLLAMA_NO_HISTORY true如何创建模型在下载的 GGUF 文件所在的同一目录下新建一个名为 Modelfile 的文件注意没有后缀名,然后在文件里面写如下内容。在文件中写入以下内容以 Qwen 2.5 为例FROM ./qwen2.5-7b-instruct-q4_k_m.gguf TEMPLATE{{ if .System }}|im_start|system {{ .System }}|im_end| {{ end }}{{ if .Prompt }}|im_start|user {{ .Prompt }}|im_end| {{ end }}|im_start|assistant PARAMETER stop|im_end|PARAMETER stop|im_start|PARAMETER num_ctx32768打开终端进入该文件所在的目录执行以下命令将模型导入 Ollamaollama create qwen2.5-custom -f ./Modelfile导入成功后即可通过ollama run qwen2.5-custom运行你的本地模型模型量化和精度量化级别显存占用精度损失推理速度FP32100%0%基准FP1650%1%15%Q8_0约 50%1%10% ~ 20%Q6_K约 37.5%1% ~ 2%25% ~ 35%Q5_K_M约 31%2% ~ 3%30% ~ 40%Q4_K_M25%3% ~ 5%40%Q3_K_M约 19%5% ~ 8%50% ~ 60%Q2_K12.5%8% ~ 10%70%本地的rag案例基于python3.8.8,需要的包如下pip install langchain-community langchain-text-splitters langchain-core langchain-ollama faiss-cpu pandas docx2txt pypdf openpyxl用途pip 安装名说明FAISS向量库底层引擎faiss-cpulangchain_community.vectorstores.FAISS实际调用它不装会报Could not load FAISSDocx2txtLoader解析 docxdocx2txt该 Loader 的内部依赖PyPDFLoader解析 pdfpypdf该 Loader 的内部依赖旧版叫PyPDF2pandas 读取.xlsxopenpyxlpd.read_excel读取 xlsx 的底层引擎入库代码fromlangchain_community.document_loadersimportDocx2txtLoaderfromlangchain_community.document_loadersimportPyPDFLoaderfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromlangchain_community.vectorstoresimportFAISSfromlangchain_ollamaimportOllamaEmbeddingsfromlangchain_core.documentsimportDocumentimportpandasaspdimportosimporttime# 清除代理防止本地127.0.0.1被代理劫持os.environ.pop(HTTP_PROXY,None)os.environ.pop(HTTPS_PROXY,None)os.environ.pop(http_proxy,None)os.environ.pop(https_proxy,None)os.environ[NO_PROXY]127.0.0.1,localhost,::1PERSIST_DIR./faiss_dbDOC_FOLDERrD:\OneboxBackup\kedd\allwordEMBED_MODELnomic-embed-textOLLAMA_BASE_URLhttp://127.0.0.1:11434BATCH_SIZE10# 自己控制每批数量SLEEP_SEC0.3# 每批间隔full_pathos.path.abspath(PERSIST_DIR)print(f PERSIST_DIR 完整路径{full_path})defread_xlsx_to_docs(file_path):pandas读取xlsx每个sheet生成一段文本返回Document列表docs[]excel_filepd.ExcelFile(file_path)forsheet_nameinexcel_file.sheet_names:dfpd.read_excel(file_path,sheet_namesheet_name)textf【工作表{sheet_name}】\ndf.to_string(indexFalse)docDocument(page_contenttext,metadata{source:file_path,sheet:sheet_name})docs.append(doc)returndocsdefload_docs(folder):docs[]file_count0fail_count0ifnotos.path.exists(folder):os.makedirs(folder)returndocs,file_count,fail_count file_listos.listdir(folder)fornameinfile_list:ifname.startswith(~$):continuefpos.path.join(folder,name)lower_namename.lower()iflower_name.endswith((.docx,.xlsx,.pdf)):file_count1print(f 正在加载文件{name})try:iflower_name.endswith(.docx):loaderDocx2txtLoader(fp)docs.extend(loader.load())eliflower_name.endswith(.xlsx):print(f⏳ pandas解析xlsx...)sheet_docsread_xlsx_to_docs(fp)docs.extend(sheet_docs)eliflower_name.endswith(.pdf):loaderPyPDFLoader(fp)docs.extend(loader.load())print(f✅ 完成{name})exceptExceptionase:fail_count1print(f❌ 加载失败【{name}】错误信息{str(e)})returndocs,file_count,fail_countif__name____main__:documents,file_total,fail_totalload_docs(DOC_FOLDER)print(f\n 一共扫描并入库文件数量{file_total}加载失败{fail_total})ifnotdocuments:print(⚠️ 没有成功加载任何文档程序退出)exit()splitterRecursiveCharacterTextSplitter(chunk_size800,chunk_overlap120)splitssplitter.split_documents(documents)print(f 开始生成向量切片总数{len(splits)}ollama地址{OLLAMA_BASE_URL})embeddingOllamaEmbeddings(modelEMBED_MODEL,base_urlOLLAMA_BASE_URL)# 手动分批生成向量解决5万多条一次性请求炸掉ollamaall_texts[d.page_contentfordinsplits]all_metas[d.metadatafordinsplits]all_embeds[]foriinrange(0,len(all_texts),BATCH_SIZE):batch_textsall_texts[i:iBATCH_SIZE]try:batch_embedsembedding.embed_documents(batch_texts)all_embeds.extend(batch_embeds)currentmin(iBATCH_SIZE,len(all_texts))print(f✅ 进度{current}/{len(all_texts)})time.sleep(SLEEP_SEC)exceptExceptionase:print(f❌ 批次{i}~{iBATCH_SIZE}失败{e})raise# 构造FAISSvectorstoreFAISS.from_embeddings(text_embeddingslist(zip(all_texts,all_embeds)),metadatasall_metas,embeddingembedding)vectorstore.save_local(PERSIST_DIR)print(f✅ 全部入库完成切片总数{len(splits)})查询代码fromlangchain_community.vectorstoresimportFAISSfromlangchain_ollamaimportOllamaEmbeddings,OllamaLLMfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.runnablesimportRunnablePassthroughfromlangchain_core.output_parsersimportStrOutputParserimportos os.environ.pop(HTTP_PROXY,None)os.environ.pop(HTTPS_PROXY,None)os.environ.pop(http_proxy,None)os.environ.pop(https_proxy,None)os.environ[NO_PROXY]127.0.0.1,localhost,::1PERSIST_DIR./faiss_dbEMBED_MODELnomic-embed-textOLLAMA_BASE_URLhttp://127.0.0.1:11434LLM_MODELds0528qwen38bnl:latest# 改成你自己的模型名比如llama3TOP_K4promptChatPromptTemplate.from_template( 你是文档问答助手根据下面的上下文回答用户问题只基于提供的内容回答不要编造。 你需要严格按照提问类型选择回答格式 1. 如果用户问【为什么、原因、原理、为什么会报错】 格式 ✅ 核心结论一句话直接给答案 原因分析1、2、3分点分析 总结简短汇总补充提示 2. 如果用户问【怎么做、如何部署、操作流程、实现步骤】 格式 前置说明环境、准备文件、依赖、风险 操作步骤有序数字步骤一步一事 ✅ 验证是否成功判断标准 ⚠️ 常见坑注意事项 3. 如果是选型、对比类问题 ✅ 整体说明 分项对比 建议 禁止乱加无关内容层级标识保留不要随意修改结构 如果问题同时包含【原因步骤】先回答原因模块再给出操作步骤模块。 上下文 {context} 用户问题{question} )if__name____main__:embeddingOllamaEmbeddings(modelEMBED_MODEL,base_urlOLLAMA_BASE_URL)vectorstoreFAISS.load_local(PERSIST_DIR,embedding,allow_dangerous_deserializationTrue)retrievervectorstore.as_retriever(search_kwargs{k:TOP_K})llmOllamaLLM(modelLLM_MODEL,base_urlOLLAMA_BASE_URL)chain({context:retriever|(lambdadocs:\n\n.join(d.page_contentfordindocs)),question:RunnablePassthrough()}|prompt|llm|StrOutputParser())print(✅ RAG就绪输入exit退出\n)whileTrue:qinput(❓问题)ifq.lower()exit:breakanschain.invoke(q)print(\n回答)print(ans)print(-*70)
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。