如何使用langChain结合Ollama实现自定义函数调用
时间: 2025-07-20 19:14:43 浏览: 3
<think>我们被要求使用中文回答,并且根据用户的问题,用户希望了解如何在LangChain中集成Ollama并实现自定义函数调用。
根据引用[2]和引用[3],我们知道可以使用LangChain的`langchain_experimental`模块中的`OllamaFunctions`来将Ollama模型与函数调用功能结合。
步骤:
1. 安装必要的库:`langchain_experimental`, `langchain_core`等。
2. 准备Ollama服务:确保Ollama服务在本地运行(例如在http://localhost:11434)。
3. 定义工具(函数):根据需求定义函数,这些函数将被模型调用。
4. 使用`OllamaFunctions`包装Ollama模型,并指定模型名称(如'qwen:14b')和格式(如'json')。
5. 创建工具列表,并将这些工具绑定到模型上。
6. 使用提示词模板和模型进行对话,并处理函数调用。
下面是一个具体的示例,展示如何实现一个天气查询和网络搜索的自定义函数调用。
注意:引用[2]中提到了使用高德API和Tavily API,因此我们需要准备相应的API Key。
我们将分步骤说明:
步骤1:安装必要的库
首先,确保已经安装了以下库(版本参考引用[2]):
- langchain_experimental (0.0.59)
- langchain_core (0.2.0)
可以使用pip安装:
```bash
pip install langchain_experimental==0.0.59 langchain_core==0.2.0
```
步骤2:启动Ollama服务
确保已经下载了所需的模型(例如qwen:14b)并启动Ollama服务。通常,安装Ollama后,服务会自动运行在`http://localhost:11434`。
步骤3:定义工具(函数)
我们需要定义两个工具:一个用于天气查询(使用高德API),另一个用于网络搜索(使用Tavily API)。
步骤4:绑定工具到模型
使用`OllamaFunctions`来包装Ollama模型,并指定模型名称和基础URL。
步骤5:创建Agent并运行
使用`AgentExecutor`来执行工具调用。
下面是一个完整的代码示例:</think>### LangChain 集成 Ollama 实现自定义函数调用指南
在 LangChain 中集成 Ollama 并实现自定义函数调用,主要通过以下步骤完成(基于引用[2][3]的实现方案):
---
#### **1. 环境准备**
```python
# 安装核心库
!pip install langchain_experimental==0.0.59 langchain_core==0.2.0 ollama
# 导入必要模块
from langchain_experimental.llms.ollama_functions import OllamaFunctions
from langchain_core.tools import tool
```
---
#### **2. 初始化 Ollama 模型**
```python
# 连接本地 Ollama 服务
model = OllamaFunctions(
model="qwen:14b", # Ollama 支持的模型名称
base_url="http://localhost:11434", # Ollama 服务地址
format="json" # 指定 JSON 输出格式(函数调用必需)
)
```
> **参数说明**:
> - `model`: Ollama 支持的模型名称(如 `llama2:13b`, `qwen:14b`)
> - `base_url`: 默认 `http://localhost:11434`
> - `format`: **必须设为 `json`** 以支持函数调用
---
#### **3. 定义自定义函数**
使用 `@tool` 装饰器创建工具函数:
```python
# 示例1:天气查询工具
@tool
def get_weather(city: str) -> str:
"""查询指定城市的实时天气"""
# 调用天气 API(此处用高德 API 示例)
import requests
url = f"https://restapi.amap.com/v3/weather?key={amap_api_key}&city={city}"
return requests.get(url).json()
# 示例2:网络搜索工具
@tool
def web_search(query: str) -> str:
"""执行网络搜索并返回摘要"""
# 调用 Tavily API
tavily_url = f"https://api.tavily.com/search?key={tavily_api_key}&query={query}"
return requests.get(tavily_url).json()["results"]
```
---
#### **4. 绑定工具并执行调用**
```python
# 绑定工具到模型
tools = [get_weather, web_search]
model = model.bind_tools(tools)
# 创建函数调用链
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有帮助的助手"),
("user", "{input}")
])
# 执行函数调用
chain = prompt | model
response = chain.invoke({"input": "上海今天的天气如何?"})
# 解析工具调用请求
if "tool_calls" in response.additional_kwargs:
tool_call = response.additional_kwargs["tool_calls"][0]
func_name = tool_call["function"]["name"]
args = json.loads(tool_call["function"]["arguments"])
# 执行实际函数
if func_name == "get_weather":
result = get_weather(args["city"])
elif func_name == "web_search":
result = web_search(args["query"])
# 将结果返回给模型生成最终回复
final_response = chain.invoke({
"input": f"工具调用结果: {result}",
"tool_calls": response # 传递历史上下文
})
```
---
#### **关键配置说明**
1. **Ollama 服务要求**:
- 需在本地运行 Ollama 服务(默认端口 `11434`)
- 提前拉取模型:`ollama pull qwen:14b`
2. **函数设计规范**:
- 必须使用 `@tool` 装饰器
- 函数文档字符串(docstring)需清晰描述功能
- 参数需指定类型注解(如 `city: str`)
3. **错误处理建议**:
```python
try:
result = tool_function(args)
except Exception as e:
result = f"工具调用失败: {str(e)}"
```
---
#### **典型应用场景**
1. **实时数据查询**:股票/天气/航班信息
2. **数据库操作**:SQL 查询执行
3. **数学计算**:复杂公式求解
4. **API 集成**:第三方服务调用
> **注意事项**:
> - Ollama 模型需支持函数调用(推荐 `qwen` 或 `llama2` 系列)
> - 复杂场景可使用 `AgentExecutor` 管理工具调用流程[^2][^3]
> - 函数参数需与模型提示词描述严格一致
---
### 相关问题
1. 如何验证 Ollama 服务是否正常运行?
2. 函数调用失败时有哪些调试方法?
3. 除了天气查询,还能实现哪些类型的自定义函数?
4. 如何优化函数调用的响应速度?
[^1]: LangChain + Ollama + DeepSeek 本地部署指南
[^2]: LangChain 中使用 Ollama 实现 Function Call
[^3]: LangChain 架构核心模块解析
[^4]: 本地部署资讯问答机器人实现方案
阅读全文
相关推荐


















