tnblog
首页
视频
资源
登录

Ollama 离线 Llama 2大语言模型的安装

18555人阅读 2023/8/22 18:20 总访问:3455468 评论:0 收藏:0 手机
分类: .net后台框架

Ollama 离线 Llama 2大语言模型的安装

Llama 2


Llama 2是由于Meta旗下开发的一款AI大语言模型,要把它跑起来是需要很多CPU、GPU等硬件资源。

Ollama简介


简单来说它相当于上面的缩减版。
它实现了本地运行Llama 2的实现方案,它通过一些模型文件Ollama打包、模型、权重、配置包,包括GPU的使用做了一定的优化。
另外LangChain也对其做了集成。

相关链接:https://ollama.ai/
https://github.com/jmorganca/ollama
https://python.langchain.com/docs/integrations/llms/ollama

Ollama下载


目前Ollama对于Mac可以进行直接安装,对于其他操作系统需要进行编译。

Mac安装


直接点击Ollama主页的安装下载安装包即可,然后进行解压,双击就完成应用到本地。


打开后我们点击next,再点击install进行Ollama命令行的安装。


然后我们需要选择我们的模型,这里我们就使用常规的模型进行安装就好了。
模型的规格如下:


打开我们的命令行执行如下命令。

  1. # 下载模型
  2. ollama run llama2
  3. # 查看进程
  4. ps -ef |grep ollama
  5. # 查看对外暴露的端口
  6. lsof -i :11434


左边我们可以看到Ollama的模型已经下载完成了,右边我们可以看到它启动的进程以及ollama开放的11434端口。这样我们就算安装完成了。

Windows安装


拉下源代码码后执行如下脚本进行编译与安装。

  1. go build .
  2. ./ollama serve &
  3. ./ollama run llama2


这样就完成安装了。

断网测试


我们在不联网的情况下进行测试它能否回答我们的一些问题。


可以说是很厉害了,接下来我们可以尝试通过API的方式来进行调用。

  1. curl -X POST http://localhost:11434/api/generate -d '{
  2. "model": "llama2",
  3. "prompt":"Why is the sky blue?"
  4. }'

LangChain调用

安装依赖

  1. # 首先安装虚拟环境
  2. python -m venv venv
  3. # 激活虚拟环境
  4. source venv/bin/activate
  5. # 安装requirements.txt相关依赖包
  6. pip install -r requirements.txt


关于requirements.txt下的相关依赖如下(其实不需要这么多但后续还有其他实验要做):

  1. absl-py==1.4.0
  2. aiohttp==3.8.5
  3. aiosignal==1.3.1
  4. anyio==3.7.1
  5. astunparse==1.6.3
  6. async-timeout==4.0.3
  7. attrs==23.1.0
  8. backoff==2.2.1
  9. beautifulsoup4==4.12.2
  10. bs4==0.0.1
  11. cachetools==5.3.1
  12. certifi==2023.7.22
  13. cffi==1.15.1
  14. chardet==5.2.0
  15. charset-normalizer==3.2.0
  16. Chroma==0.2.0
  17. chroma-hnswlib==0.7.2
  18. chromadb==0.4.5
  19. click==8.1.6
  20. coloredlogs==15.0.1
  21. cryptography==41.0.3
  22. dataclasses-json==0.5.14
  23. fastapi==0.99.1
  24. filetype==1.2.0
  25. flatbuffers==23.5.26
  26. frozenlist==1.4.0
  27. gast==0.4.0
  28. google-auth==2.22.0
  29. google-auth-oauthlib==1.0.0
  30. google-pasta==0.2.0
  31. gpt4all==1.0.8
  32. grpcio==1.57.0
  33. h11==0.14.0
  34. h5py==3.9.0
  35. httptools==0.6.0
  36. humanfriendly==10.0
  37. idna==3.4
  38. importlib-resources==6.0.1
  39. joblib==1.3.2
  40. keras==2.13.1
  41. langchain==0.0.261
  42. langsmith==0.0.21
  43. libclang==16.0.6
  44. lxml==4.9.3
  45. Markdown==3.4.4
  46. MarkupSafe==2.1.3
  47. marshmallow==3.20.1
  48. monotonic==1.6
  49. mpmath==1.3.0
  50. multidict==6.0.4
  51. mypy-extensions==1.0.0
  52. nltk==3.8.1
  53. numexpr==2.8.5
  54. numpy==1.24.3
  55. oauthlib==3.2.2
  56. onnxruntime==1.15.1
  57. openapi-schema-pydantic==1.2.4
  58. opt-einsum==3.3.0
  59. overrides==7.4.0
  60. packaging==23.1
  61. pdf2image==1.16.3
  62. pdfminer==20191125
  63. pdfminer.six==20221105
  64. Pillow==10.0.0
  65. posthog==3.0.1
  66. protobuf==4.24.0
  67. pulsar-client==3.2.0
  68. pyasn1==0.5.0
  69. pyasn1-modules==0.3.0
  70. pycparser==2.21
  71. pycryptodome==3.18.0
  72. pydantic==1.10.12
  73. PyPika==0.48.9
  74. python-dateutil==2.8.2
  75. python-dotenv==1.0.0
  76. python-magic==0.4.27
  77. PyYAML==6.0.1
  78. regex==2023.8.8
  79. requests==2.31.0
  80. requests-oauthlib==1.3.1
  81. rsa==4.9
  82. six==1.16.0
  83. sniffio==1.3.0
  84. soupsieve==2.4.1
  85. SQLAlchemy==2.0.19
  86. starlette==0.27.0
  87. sympy==1.12
  88. tabulate==0.9.0
  89. tenacity==8.2.2
  90. tensorboard==2.13.0
  91. tensorboard-data-server==0.7.1
  92. tensorflow==2.13.0
  93. tensorflow-estimator==2.13.0
  94. tensorflow-hub==0.14.0
  95. termcolor==2.3.0
  96. tokenizers==0.13.3
  97. tqdm==4.66.1
  98. typing-inspect==0.9.0
  99. typing_extensions==4.5.0
  100. unstructured==0.9.2
  101. urllib3==1.26.16
  102. uvicorn==0.23.2
  103. uvloop==0.17.0
  104. watchfiles==0.19.0
  105. websockets==11.0.3
  106. Werkzeug==2.3.6
  107. wrapt==1.15.0
  108. yarl==1.9.2

注意:安装chroma-hnswlib可能会出现问题。可以参考我这篇博客:https://www.tnblog.net/hb/article/details/8203

简单实践


我们创建一个main.py文件,并通过无限循环输入我们的问题,然后去调用Ollama的接口,代码如下:

  1. # 设置Ollama的地址
  2. ollama_host = "localhost"
  3. # 设置Ollama的端口
  4. ollama_port = 11434
  5. # 设置Ollama的模型
  6. ollama_model = "llama2"
  7. from langchain.llms import Ollama
  8. from langchain.callbacks.manager import CallbackManager
  9. from langchain.callbacks.streaming_stdout import StreamingStdOutCallHandler
  10. if __name__ == "__main__":
  11. # 通过API的方式调用Ollama
  12. # StreamingStdOutCallbackHandler 使用流式输出结果
  13. llm = Ollama(base_url=f"http://{ollama_host}:{ollama_port}",
  14. model=ollama_model,
  15. callback_manager=CallbackManager([StreamingStdOutCallHandler()])
  16. )
  17. # 通过命令行的方式调用Ollama
  18. while True:
  19. query = input("\n\n Enter a query: ")
  20. llm(query)
  1. # 运行代码
  2. python main.py
  3. # 我的python版本3.10.x

在线文档训练


我们通过官网的案例对在线的某个pdf进行分析,代码如下:

  1. from langchain.document_loaders import OnlinePDFLoader
  2. from langchain.vectorstores import Chroma
  3. from langchain.embeddings import GPT4AllEmbeddings
  4. from langchain import PromptTemplate
  5. from langchain.llms import Ollama
  6. from langchain.callbacks.manager import CallbackManager
  7. from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
  8. from langchain.chains import RetrievalQA
  9. import sys
  10. import os
  11. class SuppressStdout:
  12. # __enter__ 最先开始的时候会执行一次
  13. def __enter__(self):
  14. self._original_stdout = sys.stdout
  15. self._original_stderr = sys.stderr
  16. sys.stdout = open(os.devnull, 'w')
  17. sys.stderr = open(os.devnull, 'w')
  18. # __exit__ 最后执行一次
  19. def __exit__(self, exc_type, exc_val, exc_tb):
  20. sys.stdout.close()
  21. sys.stdout = self._original_stdout
  22. sys.stderr = self._original_stderr
  23. # 加载在线pdf并将其分成块
  24. loader = OnlinePDFLoader("https://d18rn0p25nwr6d.cloudfront.net/CIK-0001813756/975b3e9b-268e-4798-a9e4-2a9a7c92dc10.pdf")
  25. data = loader.load()
  26. # RecursiveCharacterTextSplitter是一个基于递归的字符级别的分词器。它可以将文本逐个字符地拆分,并且可以递归地处理包含其他词汇的字符,例如中文中的词语或日语中的汉字。
  27. from langchain.text_splitter import RecursiveCharacterTextSplitter
  28. # chunk_size 设置为分割块的大小
  29. # chunk_overlap 设置每个分割块之间重叠的字符数。
  30. text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
  31. all_splits = text_splitter.split_documents(data)
  32. # 使用Chroma数据库进行存储所有的分片,使用的分片方式是GPT4ALL
  33. with SuppressStdout():
  34. vectorstore = Chroma.from_documents(documents=all_splits, embedding=GPT4AllEmbeddings())
  35. while True:
  36. query = input("\nQuery: ")
  37. # 退出设置
  38. if query == "exit":
  39. break
  40. # 收到空字符串将进行跳过
  41. if query.strip() == "":
  42. continue
  43. # Prompt 设置回答的规则模版
  44. template = """Use the following pieces of context to answer the question at the end.
  45. If you don't know the answer, just say that you don't know, don't try to make up an answer.
  46. Use three sentences maximum and keep the answer as concise as possible.
  47. {context}
  48. Question: {question}
  49. Helpful Answer:"""
  50. # 通过Prompt模版生成完整语句
  51. QA_CHAIN_PROMPT = PromptTemplate(
  52. input_variables=["context", "question"],
  53. template=template,
  54. )
  55. # 开始调用
  56. llm = Ollama(model="llama2", callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]))
  57. # llm = Ollama(model="llama2:13b", callback_manager=CallbackManager([StreamingStdOutCallbackHandler()]))
  58. # 通过设置大语言模型、向量存储和prompt创建一个QA链进行回答
  59. qa_chain = RetrievalQA.from_chain_type(
  60. llm,
  61. retriever=vectorstore.as_retriever(),
  62. chain_type_kwargs={"prompt": QA_CHAIN_PROMPT},
  63. )
  64. result = qa_chain({"query": query})


通过下面的命令启动项目运行代码。

  1. python document_start.py

注意:可能会报错如下图所示。

其实是证书问题导致的,所以我们只需要更新一下我们的证书就好。

  1. # 执行这个代码
  2. /Applications/Python\ 3.10/Install\ Certificates.command


运行成功后,我们提问一下该pdf中相关的内容,我们发现回答的一般。大家可以再多调整调整。


我又换了另外一个自己的pdf进行了一下测试,感觉还是挺不错的就是有点慢,可能我的电脑还是菜了点。

支持多种的不同文件


首先我们创建一个source_documents文件夹,将我们需要训练的文件放入其中。
然后创建一个constants.py文件作为设置的全局变量。

  1. import os
  2. from chromadb.config import Settings
  3. # 定义用于存储数据库的文件夹
  4. PERSIST_DIRECTORY = os.environ.get('PERSIST_DIRECTORY', 'db')
  5. # 定义Chroma设置
  6. CHROMA_SETTINGS = Settings(
  7. chroma_db_impl='duckdb+parquet',
  8. persist_directory=PERSIST_DIRECTORY,
  9. anonymized_telemetry=False
  10. )


然后创建一个document_full.py编写我们的代码。

  1. #!/usr/bin/env python3
  2. import os
  3. import glob
  4. from typing import List
  5. from multiprocessing import Pool
  6. from tqdm import tqdm
  7. # langchain加载
  8. from langchain.document_loaders import (
  9. # 从csv文件中加载文档
  10. CSVLoader,
  11. # 从EverNote文件中加载文档
  12. EverNoteLoader,
  13. # 从PyMuPDF文件中加载文档
  14. PyMuPDFLoader,
  15. # 从文本文件中加载文档
  16. TextLoader,
  17. # 从电子邮件中加载文档
  18. UnstructuredEmailLoader,
  19. # 从EPub文件中加载文档
  20. UnstructuredEPubLoader,
  21. # 从HTML文件中加载文档
  22. UnstructuredHTMLLoader,
  23. # 从Markdown文件中加载文档
  24. UnstructuredMarkdownLoader,
  25. # 从ODT文件中加载文档
  26. UnstructuredODTLoader,
  27. # 从PowerPoint文件中加载文档
  28. UnstructuredPowerPointLoader,
  29. # 从Word文件中加载文档
  30. UnstructuredWordDocumentLoader,
  31. )
  32. # langchain加载分词器
  33. from langchain.text_splitter import RecursiveCharacterTextSplitter
  34. from langchain.vectorstores import Chroma
  35. from langchain.embeddings import HuggingFaceEmbeddings
  36. from langchain.docstore.document import Document
  37. from constants import CHROMA_SETTINGS
  38. #?加载环境变量
  39. # 数据库
  40. persist_directory = os.environ.get('PERSIST_DIRECTORY', 'db')
  41. # 源目录
  42. source_directory = os.environ.get('SOURCE_DIRECTORY', 'source_documents')
  43. # 模型名称 嵌入模型名称
  44. embeddings_model_name = os.environ.get('EMBEDDINGS_MODEL_NAME', 'all-MiniLM-L6-v2')
  45. chunk_size = 500
  46. chunk_overlap = 50
  47. # 加载电子邮件并将其转换为文档对象列表
  48. # 默认值不起作用时回退到text/plain的包装器
  49. class MyElmLoader(UnstructuredEmailLoader):
  50. """Wrapper to fallback to text/plain when default does not work"""
  51. def load(self) -> List[Document]:
  52. """Wrapper adding fallback for elm without html"""
  53. try:
  54. try:
  55. doc = UnstructuredEmailLoader.load(self)
  56. except ValueError as e:
  57. if 'text/html content not found in email' in str(e):
  58. # 报错后如果为内容没有找到文件,将尝试转为文本
  59. self.unstructured_kwargs["content_source"]="text/plain"
  60. doc = UnstructuredEmailLoader.load(self)
  61. else:
  62. raise
  63. except Exception as e:
  64. # 将文件路径添加到异常消息
  65. raise type(e)(f"{self.file_path}: {e}") from e
  66. return doc
  67. # 将文件扩展名映射到文档加载程序及其参数
  68. LOADER_MAPPING = {
  69. ".csv": (CSVLoader, {}),
  70. # ".docx": (Docx2txtLoader, {}),
  71. ".doc": (UnstructuredWordDocumentLoader, {}),
  72. ".docx": (UnstructuredWordDocumentLoader, {}),
  73. ".enex": (EverNoteLoader, {}),
  74. ".eml": (MyElmLoader, {}),
  75. ".epub": (UnstructuredEPubLoader, {}),
  76. ".html": (UnstructuredHTMLLoader, {}),
  77. ".md": (UnstructuredMarkdownLoader, {}),
  78. ".odt": (UnstructuredODTLoader, {}),
  79. ".pdf": (PyMuPDFLoader, {}),
  80. ".ppt": (UnstructuredPowerPointLoader, {}),
  81. ".pptx": (UnstructuredPowerPointLoader, {}),
  82. ".txt": (TextLoader, {"encoding": "utf8"}),
  83. # 根据需要为其他文件扩展名和加载程序添加更多映射
  84. }
  85. # 根据文件扩展名加载单个文档
  86. def load_single_document(file_path: str) -> List[Document]:
  87. ext = "." + file_path.rsplit(".", 1)[-1]
  88. if ext in LOADER_MAPPING:
  89. loader_class, loader_args = LOADER_MAPPING[ext]
  90. loader = loader_class(file_path, **loader_args)
  91. return loader.load()
  92. raise ValueError(f"Unsupported file extension '{ext}'")
  93. # 加载所有文档
  94. def load_documents(source_dir: str, ignored_files: List[str] = []) -> List[Document]:
  95. """
  96. Loads all documents from the source documents directory, ignoring specified files
  97. """
  98. all_files = []
  99. for ext in LOADER_MAPPING:
  100. # 递归加载所有文件
  101. # glob.glob() 方法用于查找匹配的文件路径名列表
  102. all_files.extend(
  103. glob.glob(os.path.join(source_dir, f"**/*{ext}"), recursive=True)
  104. )
  105. # 对于 all_files 列表中的每个元素 file_path,如果 file_path 不在 ignored_files 列表中,则将 file_path 添加到新的列表 filtered_files 中。
  106. filtered_files = [file_path for file_path in all_files if file_path not in ignored_files]
  107. # 使用多进程加载文档
  108. with Pool(processes=os.cpu_count()) as pool:
  109. # 用于存储每个文档加载的结果
  110. results = []
  111. # 创建了一个 tqdm 进度条对象 pbar,它的总长度为 filtered_files 的长度,描述为 Loading new documents,进度条的宽度为 80。
  112. with tqdm(total=len(filtered_files), desc='Loading new documents', ncols=80) as pbar:
  113. # imap_unordered() 方法返回一个迭代器,它会在进程池中的多个进程上并行地对 iterable 中的元素调用 function。
  114. for i, docs in enumerate(pool.imap_unordered(load_single_document, filtered_files)):
  115. # 将每个文档加载的结果添加到 results 列表中
  116. results.extend(docs)
  117. # 更新进度条
  118. pbar.update()
  119. return results
  120. # 加载文档并将其拆分为块
  121. def process_documents(ignored_files: List[str] = []) -> List[Document]:
  122. """
  123. Load documents and split in chunks
  124. """
  125. print(f"Loading documents from {source_directory}")
  126. # 加载文档
  127. documents = load_documents(source_directory, ignored_files)
  128. if not documents:
  129. print("No new documents to load")
  130. exit(0)
  131. print(f"Loaded {len(documents)} new documents from {source_directory}")
  132. # 创建文本拆分器
  133. text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
  134. # 拆分文档
  135. texts = text_splitter.split_documents(documents)
  136. print(f"Split into {len(texts)} chunks of text (max. {chunk_size} tokens each)")
  137. return texts
  138. # 检查 vectorstore 是否存在
  139. def does_vectorstore_exist(persist_directory: str) -> bool:
  140. """
  141. Checks if vectorstore exists
  142. """
  143. # 检查是否存在 index 文件夹
  144. if os.path.exists(os.path.join(persist_directory, 'index')):
  145. # 检查是否存在 chroma-collections.parquet 和 chroma-embeddings.parquet 文件
  146. if os.path.exists(os.path.join(persist_directory, 'chroma-collections.parquet')) and os.path.exists(os.path.join(persist_directory, 'chroma-embeddings.parquet')):
  147. # 检查是否存在 index 文件夹下的文件
  148. list_index_files = glob.glob(os.path.join(persist_directory, 'index/*.bin'))
  149. list_index_files += glob.glob(os.path.join(persist_directory, 'index/*.pkl'))
  150. # 一个工作向量库至少需要3个文档
  151. if len(list_index_files) > 3:
  152. return True
  153. return False
  154. def main():
  155. # 创建嵌入模型,HuggingFaceEmbeddings 是一个包装器,用于从 HuggingFace 模型中提取嵌入
  156. embeddings = HuggingFaceEmbeddings(model_name=embeddings_model_name)
  157. # 检查 vectorstore 是否存在
  158. if does_vectorstore_exist(persist_directory):
  159. # 更新并存储本地vectorstore
  160. print(f"Appending to existing vectorstore at {persist_directory}")
  161. # 更新 "Chroma" 数据库实例,其中 persist_directory 是数据库的持久化目录,embedding_function 是用于生成文本嵌入的函数,client_settings 是客户端的配置设置。
  162. db = Chroma(persist_directory=persist_directory, embedding_function=embeddings, client_settings=CHROMA_SETTINGS)
  163. # 通过调用 db.get() 方法获取数据库中的数据。
  164. collection = db.get()
  165. # 从获取到的数据中,提取出 metadatas 字段中的 source 字段,并将这些字段作为参数传递给 process_documents 函数。
  166. texts = process_documents([metadata['source'] for metadata in collection['metadatas']])
  167. print(f"Creating embeddings. May take some minutes...")
  168. db.add_documents(texts)
  169. else:
  170. # 创建并存储本地矢量存储
  171. print("Creating new vectorstore")
  172. texts = process_documents()
  173. print(f"Creating embeddings. May take some minutes...")
  174. db = Chroma.from_documents(texts, embeddings, persist_directory=persist_directory, client_settings=CHROMA_SETTINGS)
  175. db.persist()
  176. db = None
  177. print(f"Ingestion complete! You can now run privateGPT.py to query your documents")
  178. if __name__ == "__main__":
  179. main()


然后安装相关依赖包。

  1. pip install sentence_transformers
  2. pip install pymupdf


最后开始运行并测试,需要注意的是第一次需要下载和加载模型需要很久。

  1. python document_full.py


再次遇到问题,是由于Chroma的配置被弃用了,换个低版本就可以了。

  1. pip install --upgrade chromadb==0.3.29
  2. # 参考链接:https://github.com/imartinez/privateGPT/issues/869


安装llama2-uncensored模型。

  1. ollama pull llama2-uncensored


编写privateGPT.py,用于运行我们训练好的模型。

  1. #!/usr/bin/env python3
  2. from langchain.chains import RetrievalQA
  3. from langchain.embeddings import HuggingFaceEmbeddings
  4. from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
  5. from langchain.vectorstores import Chroma
  6. from langchain.llms import Ollama
  7. import os
  8. import argparse
  9. import time
  10. model = os.environ.get("MODEL", "llama2-uncensored")
  11. # 对于嵌入模型,该示例使用句子转换器模型
  12. # https://www.sbert.net/docs/pretrained_models.html
  13. # 全mpnet-base-v2型号提供了最好的质量,而全MiniLM-L6-v2速度快了5倍,仍然提供了良好的质量。
  14. embeddings_model_name = os.environ.get("EMBEDDINGS_MODEL_NAME", "all-MiniLM-L6-v2")
  15. persist_directory = os.environ.get("PERSIST_DIRECTORY", "db")
  16. target_source_chunks = int(os.environ.get('TARGET_SOURCE_CHUNKS',4))
  17. from constants import CHROMA_SETTINGS
  18. def main():
  19. # 分析命令行参数
  20. args = parse_arguments()
  21. embeddings = HuggingFaceEmbeddings(model_name=embeddings_model_name)
  22. db = Chroma(persist_directory=persist_directory, embedding_function=embeddings, client_settings=CHROMA_SETTINGS)
  23. retriever = db.as_retriever(search_kwargs={"k": target_source_chunks})
  24. # 激活/停用LLM的流式StdOut回调
  25. callbacks = [] if args.mute_stream else [StreamingStdOutCallbackHandler()]
  26. llm = Ollama(model=model, callbacks=callbacks)
  27. qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=retriever, return_source_documents= not args.hide_source)
  28. # 交互式问答
  29. while True:
  30. query = input("\nEnter a query: ")
  31. if query == "exit":
  32. break
  33. if query.strip() == "":
  34. continue
  35. # 从链中获取答案
  36. start = time.time()
  37. res = qa(query)
  38. answer, docs = res['result'], [] if args.hide_source else res['source_documents']
  39. end = time.time()
  40. # 打印结果
  41. print("\n\n> Question:")
  42. print(query)
  43. print(answer)
  44. # 打印用于答案的相关来源
  45. for document in docs:
  46. print("\n> " + document.metadata["source"] + ":")
  47. print(document.page_content)
  48. def parse_arguments():
  49. # privateGPT:使用LLM的功能,在没有互联网连接的情况下向您的文档提问。
  50. parser = argparse.ArgumentParser(description='privateGPT: Ask questions to your documents without an internet connection, '
  51. 'using the power of LLMs.')
  52. # -S 使用此标志可禁用打印用于答案的源文档。
  53. parser.add_argument("--hide-source", "-S", action='store_true',
  54. help='Use this flag to disable printing of source documents used for answers.')
  55. # -M 使用此标志可禁用LLM的流式StdOut回调。
  56. parser.add_argument("--mute-stream", "-M",
  57. action='store_true',
  58. help='Use this flag to disable the streaming StdOut callback for LLMs.')
  59. return parser.parse_args()
  60. if __name__ == "__main__":
  61. main()


总体来说还是比较准,但是就是慢了点,问个问题花我5-6分钟,下面我换个模型试试看。

  1. ollama pull llama2:13b
  2. MODEL=llama2:13b python privateGPT.py


更慢了。。。8分钟花了


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

基于Ollama创建Gemma定制化AI模型

基于Ollama创建Gemma定制化AI模型[TOC] 什么是Gemma?Gemma模型使用了和Gemini同源的技术,总共有20亿参数和70亿参数两种...

Harbor介绍与离线安装

Harbor介绍与离线安装[TOC] Harbor介绍Harbor是一个开源的可信云本地注册项目,用于存储、签名和扫描内容。Harbor通过添加...

离线部署Linux环境,不借助docker

离线部署Linux系统dotnet 6.0环境前言、Linux 命令请用管理员身份运行命令:sudo -s一、下载.NET环境官网地址:下载 .NET 6...

uniapp 离线打包配置

下载Android Studio 并配置好JavaSDK查看HBuilderX版本然后去下载对应的SDK版本https://pan.baidu.com/s/1ZYxRVH23EbldPQqO...

uniapp 离线打包配置高德地图

没有申请key的去高德开放平台申请的Android平台Keyhttps://console.amap.com/dev/key/app SHA1 在前面申请云端证书里面找 ...
这一世以无限游戏为使命!
排名
2
文章
633
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术