基于JSON的Ollama和LangChain agent

文章探讨了如何通过为语言模型(LLMs)如ChatGPT提供额外的工具,如图数据库交互,以增强其功能。作者介绍了如何使用Mixtral8x7b与Neo4j进行交互,创建了一个基于JSON的代理,展示了如何定义和使用复杂的工具输入来提升LLM的交互性和个性化服务。
部署运行你感兴趣的模型镜像

到目前为止,我们都可能意识到,通过为LLMs提供额外的工具,我们可以显著增强它们的功能。

例如,即使是ChatGPT在付费版本中也可以直接使用Bing搜索和Python解释器。OpenAI更进一步,为工具使用提供了经过优化的LLM模型,您可以将可用的工具和提示一起传递给API端点。

然后LLM决定是否可以直接提供回答,或者是否应该首先使用任何可用的工具。

请注意,这些工具不仅仅用于获取额外的信息;它们可以是任何东西,甚至可以让LLMs预订晚餐。我之前实施过一个项目,允许LLM通过一组预定义的工具与图数据库进行交互,我称之为语义层。

一个与图数据库交互的代理LLM。图片由作者提供。

本质上,这些工具通过提供动态、实时的信息访问、通过记忆进行个性化以及通过知识图谱对关系进行复杂的理解,来增强像GPT-4这样的LLM。

它们共同使LLM能够提供更准确的推荐,随着时间的推移了解用户的偏好,并获得更广泛的最新信息,从而实现更具互动性和适应性的用户体验。

正如提到的那样,除了在查询时能够检索到额外的信息外,它们还给LLM提供了一种影响他们环境的选择,例如在日历中预订会议。

虽然OpenAI为我们提供了精细调整的模型来进行工具使用,但事实是,大多数其他LLMs在函数调用和工具使用方面都不及OpenAI水平。

我已经尝试了Ollama中大部分可用的模型,大多数都难以始终生成可用于驱动代理的预定义结构化输出。另一方面,有一些模型是针对函数调用进行了优化的。

然而,这些模型采用了一种自定义的提示工程模式来进行函数调用,但这种模式并没有很好地记录,或者它们不能用于除了函数调用之外的任何其他用途。

最终,我决定遵循现有的LangChain实现,使用基于JSON的代理,使用Mixtral 8x7b LLM。我将Mixtral 8x7b用作电影代理,通过语义层与Neo4j进行交互,Neo4j是一种本地图数据库。代码可作为Langchain模板Jupyter笔记本提供。如果你对工具的实现方式感兴趣,可以查看我之前的博客文章。在这里,我们将讨论如何实现基于JSON的LLM代理。

语义层中的工具

LangChain文档中的示例(JSON代理HuggingFace示例)使用的是只有一个字符串输入的工具。由于语义层中的工具使用稍微复杂一些的输入,我不得不深入研究一下。这是一个推荐工具的示例输入。

all_genres = [
    "Action",
    "Adventure",
    "Animation",
    "Children",
    "Comedy",
    "Crime",
    "Documentary",
    "Drama",
    "Fantasy",
    "Film-Noir",
    "Horror",
    "IMAX",
    "Musical",
    "Mystery",
    "Romance",
    "Sci-Fi",
    "Thriller",
    "War",
    "Western",
]


class RecommenderInput(BaseModel):
    movie: Optional[str] = Field(description="movie used for recommendation")
    genre: Optional[str] = Field(
        description=(
            "genre used for recommendation. Available options are:" f"{all_genres}"
        )
    )

推荐工具有两个可选输入:电影和类型。此外,我们使用一个可用值的枚举来表示类型参数。

虽然输入并不是非常复杂,但仍比单个字符串输入更先进,因此实现方式必须稍有不同。

基于JSON的LLM代理的提示

在我的实现中,我从LangChain hub中现有的 hwchase17/react-json 提示中获得了很大的灵感。该提示使用以下系统消息。

Answer the following questions as best you can. You have access to the following tools:

{tools}

The way you use the tools is by specifying a json blob.
Specifically, this json should have a `action` key (with the name of the tool to use) and a `action_input` key (with the input to the tool going here).

The only values that should be in the "action" field are: {tool_names}

The $JSON_BLOB should only contain a SINGLE action, do NOT return a list of multiple actions. Here is an example of a valid $JSON_BLOB:

```
{{
  "action": $TOOL_NAME,
  "action_input": $INPUT
}}
```

ALWAYS use the following format:

Question: the input question you must answer
Thought: you should always think about what to do
Action:
```
$JSON_BLOB
```
Observation: the result of the action
... (this Thought/Action/Observation can repeat N times)
Thought: I now know the final answer
Final Answer: the final answer to the original input question

Begin! Reminder to always use the exact characters `Final Answer` when responding.

提示从定义可用工具开始,稍后我们将介绍。提示的最重要部分是指示LLM输出应该是什么样子的。当LLM需要调用一个函数时,应该使用以下JSON结构:

{{
  "action": $TOOL_NAME,
  "action_input": $INPUT
}}

这就是为什么它被称为基于JSON的代理:当LLM想要使用任何可用工具时,我们指示它生成一个JSON。然而,这只是输出定义的一部分。完整的输出应该具有以下结构:

Thought: you should always think about what to do
Action:
```
$JSON_BLOB
```
Observation: the result of the action
... (this Thought/Action/Observation can repeat N times)
Final Answer: the final answer to the original input question

LLM应该在输出的思考部分解释它正在做什么。当它想要使用任何可用的工具时,应该将动作输入提供为JSON blob。

观察部分保留给工具输出,当代理决定可以向用户返回答案时,应使用最终答案键。以下是使用此结构的电影代理的示例。

在这个例子中,我们要求代理人推荐一部好的喜剧片。由于代理人可用的工具之一是推荐工具,它决定利用推荐工具,通过提供JSON语法来定义其输入。幸运的是,LangChain具有内置的JSON代理输出解析器,所以我们不必担心实现它。接下来,LLM从工具中获得一个响应,并将其作为提示中的观察。

由于工具提供了所有所需的信息,LLM决定它已经有足够的信息来构建最终答案,并将其返回给用户。

我注意到很难促使工程师Mixtral只在需要使用工具时使用JSON语法。在我的实验中,当它不想使用任何工具时,有时会使用以下JSON动作输入。

{{
  "action": Null,
  "action_input": ""
}}

LangChain中的输出解析函数不会忽略空或类似的操作,而是返回一个错误,指出未定义空工具。我试图向工程师提供解决这个问题的提示,但无法以一致的方式做到。

因此,我决定添加一个虚拟的闲聊工具,当用户想要闲聊时,代理可以调用它。

response = (
    "Create a final answer that says if they "
    "have any questions about movies or actors"
)


class SmalltalkInput(BaseModel):
    query: Optional[str] = Field(description="user query")


class SmalltalkTool(BaseTool):
    name = "Smalltalk"
    description = "useful for when user greets you or wants to smalltalk"
    args_schema: Type[BaseModel] = SmalltalkInput

    def _run(
        self,
        query: Optional[str] = None,
        run_manager: Optional[CallbackManagerForToolRun] = None,
    ) -> str:
        """Use the tool."""
        return response

这样,代理可以在用户打招呼时决定使用一个虚拟的Smalltalk工具,我们不再遇到解析空或缺失工具名称的问题。

这个解决方法非常有效,所以我决定保留它。正如提到的,大多数模型没有经过训练来产生行动输入或文本,如果不需要行动,我们必须使用当前可用的内容。

然而,有时候模型在第一次迭代时成功地不调用任何工具,这取决于情况。但是给它一个像smalltalk工具这样的逃逸选项似乎可以防止异常。

在系统提示中定义工具输入

如前所述,我必须弄清楚如何定义稍微复杂的工具输入,以便LLM能够正确解释它们。

有趣的是,在实施自定义函数之后,我发现了一个现有的LangChain函数,它将自定义的Pydantic工具输入定义转换为Mixtral可以识别的JSON对象。

from langchain.tools.render import render_text_description_and_args

tools = [RecommenderTool(), InformationTool(), Smalltalk()]

tool_input = render_text_description_and_args(tools)
print(tool_input)

生成以下字符串描述:

"Recommender":"useful for when you need to recommend a movie",
"args":{
   {
      "movie":{
         {
            "title":"Movie",
            "description":"movie used for recommendation",
            "type":"string"
         }
      },
      "genre":{
         {
            "title":"Genre",
            "description":"genre used for recommendation. Available options are:['Action', 'Adventure', 'Animation', 'Children', 'Comedy', 'Crime', 'Documentary', 'Drama', 'Fantasy', 'Film-Noir', 'Horror', 'IMAX', 'Musical', 'Mystery', 'Romance', 'Sci-Fi', 'Thriller', 'War', 'Western']",
            "type":"string"
         }
      }
   }
},
"Information":"useful for when you need to answer questions about various actors or movies",
"args":{
   {
      "entity":{
         {
            "title":"Entity",
            "description":"movie or a person mentioned in the question",
            "type":"string"
         }
      },
      "entity_type":{
         {
            "title":"Entity Type",
            "description":"type of the entity. Available options are 'movie' or 'person'",
            "type":"string"
         }
      }
   }
},
"Smalltalk":"useful for when user greets you or wants to smalltalk",
"args":{
   {
      "query":{
         {
            "title":"Query",
            "description":"user query",
            "type":"string"
         }
      }
   }
}

我们可以简单地将这个工具描述复制到系统提示中,Mixtral就能够使用定义好的工具,这非常酷。

 结论

JSON-based agent的大部分工作是由Harrison Chase和LangChain团队完成的,我对此表示感谢。我所要做的就是找到拼图的碎片并将它们组合起来。正如前面提到的,不要期望与GPT-4一样的代理性能水平。然而,我认为像Mixtral这样更强大的OSSLLMs可以作为代理使用(比GPT-4需要更多的异常处理)。

我期待更多的开源LLMs被调整得更好作为代理。

代码可作为Langchain模板Jupyter笔记本提供。

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

<think>我们正在使用LangChainOllama来构建一个多模态应用。多模态意味着模型可以处理多种类型的输入(如文本、图像等)。Ollama支持多模态模型(例如LLaVA),而LangChain提供了Agent Executor来协调多步骤的任务。 步骤: 1. 确保Ollama已经安装并运行,且已经拉取了一个多模态模型(如llava)。 2. 在LangChain中使用Ollama的多模态模型,并构建一个Agent,该Agent可以使用工具来处理多模态输入(例如,处理图像的工具)。 但是,请注意:目前(截至2023年10月)LangChain对多模态的支持还在发展中,特别是与Ollama的结合。不过,我们可以尝试以下方法: 思路: - 使用Ollama的llava模型,它可以同时接受图像文本。 - 在LangChain中,我们可以使用`Ollama`类来加载模型,但需要处理多模态输入(即同时传递图像文本)。 - 然而,标准的`Ollama`类可能不支持直接传递图像。因此,我们需要自定义一个多模态的代理或工具。 另一种方法: 使用LangChainAgent Executor,我们可以设计一个代理,它能够使用工具来处理图像(例如,使用图像描述工具将图像转换为文本描述),然后将文本描述问题一起发送给文本模型。 具体步骤(以图像问答为例): 1. 用户输入一个问题一个图像。 2. 代理首先使用一个图像描述工具(例如,使用llava模型)将图像转换为文本描述。 3. 将原始问题图像描述一起发送给文本模型(可以是同一个llava模型,也可以是另一个文本模型)来生成答案。 因此,我们需要两个工具: - 一个图像描述工具:输入图像,输出描述文本。 - 一个文本模型工具:输入文本(包含问题图像描述),输出答案。 但是,由于llava模型本身就可以同时接受图像文本,我们可以直接使用它,而不需要拆分成两个步骤。然而,在LangChainAgent框架中,我们可能需要将多模态输入拆分成不同的工具调用。 鉴于目前LangChainOllama多模态支持的限制,我们可以采用以下折中方案: 方案一:直接使用Ollama的llava模型进行多模态推理(不通过Agent) - 如果我们只需要简单的问答,不需要复杂的工具调用,那么可以直接使用模型。 方案二:构建一个自定义的Agent,该Agent能够处理多模态输入(图像文本),并调用相应的工具。 这里我们关注方案二,因为用户要求使用Agent Executor。 步骤: 1. 定义工具:至少需要一个工具来处理图像(例如,使用llava模型生成图像描述)。 2. 构建一个代理,该代理能够根据问题决定是否使用图像描述工具。 但是,注意:如果问题中包含图像,那么我们需要将图像作为输入传递给工具。然而,标准的LangChain Agent默认只接受文本输入。因此,我们需要自定义代理的输入,使其能够处理图像。 这涉及到LangChain中较高级的自定义。我们可以这样设计: - 代理的输入应该是一个字典,包含文本图像(可选)。 - 我们自定义一个代理,它能够检查输入中是否有图像,如果有,则先调用图像描述工具生成图像描述,然后将描述与原始问题拼接,再调用文本模型工具。 然而,这实际上是一个单一的工具调用流程,而不是由代理动态决定。因此,我们可以不使用Agent Executor,而是使用自定义链。 但是,如果用户坚持要使用Agent Executor,我们可以设计一个简单的代理,它有两个工具:一个用于图像描述,一个用于文本生成。代理根据问题是否涉及图像来决定调用哪个工具。 然而,多模态问题通常同时包含文本图像,所以我们需要同时使用两个工具?这并不理想。 因此,我建议采用以下架构: 使用LangChain的`Tool``AgentType`,构建一个代理,该代理可以调用一个多模态工具(该工具内部使用llava模型处理图像文本)。 具体步骤: 1. 定义一个多模态工具,该工具可以接受一个包含文本图像路径(或base64编码)的字典,然后调用Ollama的llava模型并返回结果。 2. 将这个工具提供给代理,代理根据用户输入(包含文本图像)来调用这个工具。 但是,代理如何知道何时调用这个工具?我们需要在代理的提示词中说明:当问题涉及图像时,使用这个工具。 然而,标准的LangChain代理(如ZERO_SHOT_REACT_DESCRIPTION)是为文本设计的,不支持多模态输入。 因此,我们需要自定义代理的提示词输入模式。 考虑到复杂性,这里提供一个简化的示例,我们构建一个只调用一个工具(多模态工具)的代理,实际上相当于一个链,但使用了Agent框架。 步骤: 1. 定义多模态工具函数,它能够处理图像文本。 2. 将这个工具添加到代理的工具列表中。 3. 构建代理,并设置提示词,使得代理总是调用这个工具。 示例代码: 首先,安装必要的包: ```bash pip install langchain langchain-experimental ``` 然后,编写代码: 注意:由于Ollama的API可以直接接受多模态输入(图像文本),我们可以通过Ollama的API调用llava模型。 在LangChain中,我们可以使用`Ollama`类,但它目前(0.0.28版本)不支持多模态。因此,我们需要自定义一个工具,使用Ollama的原始API来调用llava模型。 参考Ollama的API文档:POST /api/generate,我们可以发送一个包含图像文本的请求。 自定义工具: ```python import requests from langchain.tools import BaseTool from pydantic import BaseModel, Field import base64 class MultimodalInput(BaseModel): text: str = Field(..., description="The text question about the image") image_path: str = Field(..., description="The path to the image file") class MultimodalTool(BaseTool): name = "multimodal_tool" description = "Use this tool when you need to answer questions about an image. Input should be a dictionary with 'text' (the question) and 'image_path' (the path to the image)." args_schema = type("MultimodalInputSchema", (BaseModel,), { "text": str, "image_path": str }) def _run(self, text: str, image_path: str): # 读取图像并编码为base64 with open(image_path, "rb") as image_file: encoded_string = base64.b64encode(image_file.read()).decode('utf-8') # 构建请求体 data = { "model": "llava", # 确保你已经拉取了llava模型 "prompt": text, "images": [encoded_string], "stream": False } # 发送请求到Ollama response = requests.post("http://localhost:11434/api/generate", json=data) response.raise_for_status() response_json = response.json() return response_json.get("response", "") ``` 然后,构建代理: ```python from langchain.agents import AgentExecutor, initialize_agent, AgentType from langchain.llms import Ollama # 用于文本模型,但这里我们主要用工具 from langchain.memory import ConversationBufferMemory # 注意:由于我们的工具是多模态的,而代理的默认输入是文本,我们需要自定义代理的输入。 # 但是,为了简化,我们假设代理的输入已经将图像路径文本问题合并成一个字符串,然后在工具中解析。 # 然而,这并不优雅。因此,我们可能需要自定义代理的输入解析。 # 另一种思路:我们构建一个代理,它只有一个工具(即上面的多模态工具),并且我们重写代理的输入,使其能够接受图像路径文本。 # 由于时间限制,我们采用一个折中方案:将用户输入格式化为一个字符串,包含文本图像路径,然后在工具中解析。 # 例如,用户输入:"What is in this image? /path/to/image.jpg" # 修改工具,使其接受一个字符串,然后解析出文本图像路径(假设图像路径在最后,且以空格分隔) # 这很脆弱,但作为示例。 class MultimodalTool(BaseTool): name = "multimodal_tool" description = "Use this tool when you need to answer questions about an image. Input should be a string where the last word is the path to the image, and the rest is the question." args_schema = None # 不使用schema,因为我们直接处理字符串 def _run(self, input_str: str): # 将输入按空格分割,最后一个部分是图像路径,其余部分是问题 parts = input_str.rsplit(' ', 1) if len(parts) < 2: raise ValueError("Input should be in the format: 'question image_path'") text = parts[0] image_path = parts[1] # 读取图像并编码为base64 with open(image_path, "rb") as image_file: encoded_string = base64.b64encode(image_file.read()).decode('utf-8') data = { "model": "llava", "prompt": text, "images": [encoded_string], "stream": False } response = requests.post("http://localhost:11434/api/generate", json=data) response.raise_for_status() response_json = response.json() return response_json.get("response", "") # 初始化一个文本模型(用于代理的推理,但注意:代理本身也是用文本模型驱动的) llm = Ollama(model="llama2") # 这里使用llama2作为代理的驱动模型,因为代理需要文本推理能力 # 工具列表 tools = [MultimodalTool()] # 初始化代理 agent = initialize_agent( tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True ) # 现在,我们可以这样调用代理: # 注意:输入字符串中,问题在前,图像路径在后,用空格分隔。 agent.run("What is in this image? /path/to/image.jpg") ``` 但是,这种方法存在缺陷: - 图像路径中如果有空格,会解析错误。 - 代理的驱动模型(llama2)是纯文本的,它可能无法理解图像相关的指令,但它的任务只是决定调用工具(因为只有一个工具,所以总是会调用)。 因此,我们可以使用更简单的链: ```python def multimodal_chain(question, image_path): tool = MultimodalTool() return tool.run(f"{question} {image_path}") # 调用 result = multimodal_chain("What is in this image?", "/path/to/image.jpg") ``` 然而,用户要求使用Agent Executor。因此,我们使用上述代理的方式,尽管它有些勉强。 改进:我们可以自定义代理的输入为两个字段:文本图像路径。但这需要更深入的自定义LangChainAgent。 由于这是一个复杂且不断发展的主题,请关注LangChain的更新,以获取更好的多模态支持。 总结:目前,我们可以通过自定义工具代理的方式,在LangChain中使用Ollama的多模态模型(如llava)来处理图像文本的输入。但需要注意工具输入输出的设计。 参考文献: [1] Ollama官方文档:https://ollama.com/ [2] LangChainOllama集成:https://python.langchain.com/docs/integrations/llms/ollama 注意:上面的代码示例假设Ollama服务运行在本地11434端口,并且已经安装了llava模型(通过`ollama pull llava`)。 相关问题: 1. 如何安装配置Ollama以支持多模态模型? 2. 在LangChain中如何处理多模态输入(如图像文本)? 3. 如何为LangChain代理设计多模态工具? 4. Ollama支持哪些多模态模型? 5. 如何优化多模态代理的性能?</think>### 使用 LangChain Agent Executor Ollama 实现多模态应用的方法 多模态应用需要同时处理文本、图像、音频等多种输入类型。以下是结合 LangChain Agent Executor Ollama 的实现方法: --- #### **1. 核心组件准备** - **Ollama 配置**: 1. 安装支持多模态的模型(如 LLaVA): ```bash ollama pull llava # 支持图像+文本的多模态模型 ``` 2. 启动 Ollama 服务: ```bash ollama serve ``` - **LangChain 环境**: 安装必要依赖: ```bash pip install langchain langchain-experimental openai python-dotenv ``` --- #### **2. 构建多模态代理框架** ```python from langchain.agents import AgentExecutor, Tool from langchain_experimental.agents.agent_toolkits import create_python_agent from langchain.llms import Ollama from langchain.tools import BaseTool import requests import base64 # 初始化多模态模型 llava = Ollama(base_url="http://localhost:11434", model="llava") class ImageAnalysisTool(BaseTool): name = "image_analyzer" description = "分析图像内容并返回文本描述" def _run(self, image_path: str): with open(image_path, "rb") as img_file: img_base64 = base64.b64encode(img_file.read()).decode("utf-8") response = requests.post( "http://localhost:11434/api/generate", json={ "model": "llava", "prompt": "描述这张图片的内容", "images": [img_base64], "stream": False } ) return response.json()["response"] # 创建工具集 tools = [ ImageAnalysisTool(), Tool( name="text_qa", func=lambda q: llava.generate([q]).generations[0][0].text, description="回答文本问题" ) ] # 构建代理执行器 agent = create_python_agent( llm=llava, tools=tools, verbose=True ) agent_executor = AgentExecutor.from_agent_and_tools( agent=agent.agent, tools=tools, verbose=True ) ``` --- #### **3. 多模态处理流程** 1. **输入解析**: - 文本输入:直接传递给代理 - 图像输入:通过 `ImageAnalysisTool` 生成描述文本 - 混合输入:组合图像描述文本问题 2. **代理决策**: ```python # 示例:处理图像+文本查询 response = agent_executor.run( "这张图片中的物体是什么?请解释其用途。图片路径:/data/sample.jpg" ) ``` 代理自动调用图像分析工具获取描述,再结合文本问题生成最终响应。 3. **输出整合**: - 图像描述 + 文本回答组合输出 - 支持生成结构化数据(如 JSON) --- #### **4. 高级功能扩展** - **多工具协同**: ```python tools.append( Tool( name="web_search", func=web_search_tool, # 自定义网络搜索工具 description="获取实时网络信息" ) ) ``` 代理可自动选择工具链:`图像分析 → 网络搜索 → 答案生成` - **记忆增强**: ```python from langchain.memory import ConversationBufferMemory memory = ConversationBufferMemory() agent_executor = AgentExecutor(..., memory=memory) ``` 支持跨模态对话上下文记忆 - **自定义提示工程**: ```python from langchain import PromptTemplate multimodal_prompt = PromptTemplate( template=""" 你是一个多模态助手。请结合图像描述问题作答: 图像描述: {image_desc} 用户问题: {question} 最终回答:""", input_variables=["image_desc", "question"] ) ``` --- #### **5. 部署与优化建议** 1. **性能优化**: - 使用 Ollama 的批处理 API 提高吞吐量 - 对图像预处理(压缩/裁剪)减少传输开销 2. **错误处理**: ```python try: response = agent_executor.run(query) except Exception as e: # 回退到纯文本模型 backup_model = Ollama(model="llama3") response = backup_model(query) ``` 3. **安全考虑**: - 限制图像处理权限 - 添加内容审核层(如 NSFW 过滤) > **关键提示**:多模态代理的核心是将非文本输入转换为模型可理解的中间表示(如图像→文本描述),再通过 LangChainAgent 框架协调工具调用[^1]。 --- ### 相关问题 1. **如何优化 Ollama 多模态模型的响应速度?** - 模型量化(4-bit 量化) - 启用 GPU 加速(`OLLAMA_NUM_GPU=1`) - 使用缓存层存储常见查询结果 2. **LangChain Agent 如何处理音频输入的多模态场景?** 需添加音频转文本工具(如 Whisper),流程: ``` 音频输入 → 语音转文本 → 文本+其他模态 → 代理处理 ``` 3. **在多模态应用中如何保证数据隐私?** - 本地化部署 Ollama[^2] - 使用差分隐私技术 - 敏感数据匿名化处理 4. **如何评估多模态代理的性能?** 建议指标: - 跨模态检索准确率 - 端到端响应延迟 - 工具调用正确率 - 人类评估综合质量 5. **是否支持实时视频流处理?** 可通过分帧处理实现: ```python video_frames = extract_frames(video) # 每秒抽帧 results = [agent_executor(frame) for frame in video_frames] summary = llava(f"总结视频内容: {results}") ``` [^1]: Ollama 提供了两种与模型交互的方式:本地 API LangChain 集成 [^2]: Ollama 官方文档:https://ollama.com/
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值