基于 Ollama + LangChain 的 AI 旅行计划生成器开发教程

基于 Ollama + LangChain 的 AI 旅行计划生成器开发教程

一、项目概述

1. 目标

使用本地部署的 Ollama DeepSeek 模型和 LangChain 框架,开发一个能根据用户输入生成旅行计划的 AI 应用。

2. 技术栈

  • 大语言模型:Ollama 部署的 DeepSeek 模型
  • 框架:LangChain(最新版)
  • 开发语言:Python 3.9+

二、环境准备

1. 安装 Ollama 并部署 DeepSeek 模型

# 安装 Ollama( macOS/Linux 示例)
curl https://ollama.ai/install.sh | sh

# 下载并部署 DeepSeek 模型
ollama pull deepseek-r1:32b

2. 创建 Python 虚拟环境

# 创建虚拟环境
python3 -m venv travel-env
source travel-env/bin/activate  # Linux/macOS
.\travel-env\Scripts\activate  # Windows

# 安装依赖
pip install --upgrade langchain langchain-community langchain-ollama

三、核心概念讲解

1. Ollama

  • 本地运行大语言模型的工具,支持多种开源模型
  • 通过 HTTP API 与模型交互

2. LangChain

  • RunnableSequence:替代旧的 LLMChain,用管道方式连接组件
  • 提示模板:结构化输入提示,引导模型生成更准确的输出
  • 回调系统:监控模型调用过程,实现流式输出

四、代码实现

1. 完整代码

import os
from langchain.prompts import ChatPromptTemplate
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
from langchain_ollama import OllamaLLM


# 配置 Ollama 模型
def setup_ollama_model(model_name="deepseek-r1:7b"):
  """设置Ollama模型连接"""
  return OllamaLLM(
    base_url="http://192.168.34.61:11434",
    model=model_name,
    callbacks=[StreamingStdOutCallbackHandler()]  # 使用callbacks替代callback_manager
  )


# 创建旅行计划生成链
def create_travel_chain(llm):
  """使用RunnableSequence创建旅行计划生成链"""
  # 定义提示模板
  prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个专业的旅行规划师。你的任务是根据用户的需求,生成详细的旅行计划。"),
    ("user", """我计划去{destination}旅行,时间为{duration}天,预算大约{budget}元。
        请为我生成一个详细的旅行计划,包括每日行程安排、交通方式、推荐的餐厅和住宿选择。
        请确保计划合理、有趣且符合我的预算。""")
  ])

  # 使用RunnableSequence替代LLMChain
  return prompt | llm


# 定义一个函数,用于提取思考过程和推理结果
def extract_langchain_thinking_and_response(data):
  """
    提取langchain思考过程和推理结果。

    参数:
        data (dict): Ollama 返回的 JSON 数据。

    返回:
        tuple: 包含思考过程和推理结果的元组。
  """
  # 初始化思考过程和推理结果变量
  thinking_process = ""
  response_content = ""

  # 检查是否包含思考过程
  if "<think>" in data and "</think>" in data:
    # 提取思考过程,去除标签
    start = data.find("<think>") + len("<think>")  # 找到 "<think>" 标签的起始位置
    end = data.find("</think>")  # 找到 "</think>" 标签的结束位置
    thinking_process = data[start:end].strip()  # 提取标签内的内容并去除首尾空格

    # 提取推理结果(即消息的其余部分)
    response_content = data.split("</think>")[-1].strip()  # 从 "</think>" 标签之后的内容中提取推理结果
  # 返回思考过程和推理结果
  return thinking_process, response_content


# 主函数
def main():
  # 设置API密钥(如果需要)
  os.environ["OLLAMA_BASE_URL"] = "http://localhost:11434"

  # 初始化模型
  print("正在连接到本地Ollama模型...")
  llm = setup_ollama_model()

  # 创建旅行计划链
  travel_chain = create_travel_chain(llm)

  # 收集用户输入
  destination = input("请输入你的旅行目的地:")
  duration = input("请输入你的旅行天数:")
  budget = input("请输入你的大致预算(元):")

  # 生成旅行计划
  print("\n正在为你生成旅行计划...\n")
  result = travel_chain.invoke({
    "destination": destination,
    "duration": duration,
    "budget": budget
  })

  # 保存结果
  with open("travel_plan.md", "w", encoding="utf-8") as f:
    f.write(f"# {destination}旅行计划 ({duration}天,预算{budget}元)\n\n")
    # f.write(result)
    thinking_process, response_content = extract_langchain_thinking_and_response(result)
    f.write(response_content)

  print("\n旅行计划已生成并保存到 travel_plan.md")


if __name__ == "__main__":
  main()

2. 关键代码解析

模型初始化
from langchain_ollama import OllamaLLM

llm = OllamaLLM(
    base_url="http://localhost:11434",
    model="deepseek-r1:7b",
    callbacks=[StreamingStdOutCallbackHandler()]  # 实时显示生成内容
)
提示工程
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是专业旅行规划师..."),  # 设定AI角色
    ("user", "我计划去{destination}旅行{duration}天...")  # 用户输入变量
])
模型调用
# 使用管道式调用替代旧的LLMChain
chain = prompt | llm
result = chain.invoke({
    "destination": "北京",
    "duration": "3",
    "budget": "3000"
})

五、运行与测试

1. 启动 Ollama 服务

ollama serve

2. 执行程序

python travel_planner.py

3. 示例输入与输出

旅行目的地:成都
旅行天数:4
预算(元):5000

# 生成内容示例
# 成都旅行计划 (4天,预算5000元)

### 第一天:市区文化探索
- **上午**:抵达成都双流机场,乘坐地铁10号线前往春熙路...
- **推荐餐厅**:钟水饺(春熙路店)...
- **住宿**:春熙路附近酒店(预算300-500元/晚)
...

六、常见问题与解决方案

1. 依赖问题

# 安装最新依赖
pip install -U langchain langchain-community langchain-ollama

2. API 变更

  • 旧版 Ollama → 新版 from langchain_ollama import OllamaLLM
  • callback_managercallbacks
  • LLMChainRunnableSequence

3. 连接错误

检查 Ollama 服务是否启动:

curl http://localhost:11434/api/tags  # 应返回模型列表

七、扩展与优化

1. 功能增强

  • 添加多轮对话支持
  • 集成地图可视化
  • 增加酒店/景点评分功能

2. 性能优化

  • 添加缓存机制
  • 实现异步调用
  • 模型量化压缩

3. 界面改进

开发 Web 界面:

pip install flask  # 或 streamlit

八、总结

通过本教程,你学会了:

  1. 本地部署和使用 Ollama 模型
  2. 使用 LangChain 最新 API 开发应用
  3. 处理库版本变更带来的兼容性问题
  4. 基于大模型构建实用工具的基本流程

这个项目可以作为 AI 应用开发的起点,你可以根据需求扩展更多功能!

<think>嗯,用户想了解如何将QGIS、OllamaDeepSeekLangChain集成或使用。首先,我需要明确每个工具的作用和它们之间的潜在联系。 QGIS是开源的地理信息系统,用于处理地理数据。Ollama是本地运行大模型的工具,DeepSeek可能指深度求索公司的AI模型,而LangChain是用于构建基于语言模型应用的框架。用户可能希望将这些工具结合起来,比如用AI模型处理地理数据,或者通过LangChain整合流程。 接下来,我需要考虑集成的可能性。例如,使用LangChain调用Ollama运行的DeepSeek模型来分析QGIS中的地理数据。可能需要通过Python脚本将QGIS的数据导出,然后由LangChain处理,再返回结果到QGIS展示。 还要注意用户可能遇到的问题,比如环境配置、API调用、数据格式转换等。需要提供具体的步骤和示例代码,例如如何在QGIS中运行Python脚本,如何安装必要的库,如何处理可能出现的错误,比如中文乱码或模型响应问题。 另外,用户可能需要实际案例,比如自动化生成区域报告或空间数据分析。解决方案部分应涵盖常见问题的处理方法,如依赖冲突、网络连接问题等。需要确保引用的资料相关,比如QGIS的安装和使用教程,以及处理乱码的方法。 最后,生成的相关问题要覆盖集成中的各个技术点,帮助用户深入理解每个环节可能遇到的挑战和解决方法。需要确保回答结构清晰,步骤详细,代码示例正确,并且引用合适的参考资料。</think>### QGIS与Ollama/DeepSeek/LangChain集成使用指南 #### 一、技术栈功能定位 1. **QGIS**:开源地理信息系统,用于空间数据可视化、分析和地图制作[^2] 2. **Ollama**:本地化大语言模型运行框架,支持LLaMA、DeepSeek等模型部署 3. **DeepSeek**:深度求索公司开发AI大模型,擅长数学推理和代码生成 4. **LangChain**:语言模型应用开发框架,支持工具链整合与工作流编排 #### 二、集成实现路径 **步骤1:环境准备** ```bash # 安装LangChain及地理数据处理库 pip install langchain qgis-processing geopy ``` **步骤2:QGIS数据接入** ```python # 在QGIS Python控制台中读取图层数据 layer = iface.activeLayer() features = [f.attributes() for f in layer.getFeatures()] geom_data = [f.geometry().asWkt() for f in layer.getFeatures()] ``` **步骤3:LangChainOllama集成** ```python from langchain_community.llms import Ollama ollama_llm = Ollama(base_url='http://localhost:11434', model="deepseek-chat") response = ollama_llm.invoke( f"分析以下地理数据:{features[:3]},给出空间分布特征总结") ``` **步骤4:空间数据分析示例** ```python # 结合地理信息库进行坐标转换 from geopy.distance import geodesic def calculate_area(buffer_km): # 在QGIS中创建缓冲区 processing.run("native:buffer", { 'INPUT': layer, 'DISTANCE': buffer_km*1000, 'OUTPUT': 'memory:' }) return "缓冲区分析完成" # 通过LangChain工具封装 tools = [ Tool( name="BufferAnalysis", func=calculate_area, description="空间缓冲区分析工具" ) ] ``` #### 三、典型应用场景 1. **智能制图标注**:通过LLM自动生成地图标注文本[^1] 2. **空间数据语义查询**:使用自然语言查询地理数据库 3. **分析报告生成**:自动生成区域发展分析报告 ```python # 报告生成示例 report_template = """ 根据{region}地区{data_type}数据: 1. 识别前三大特征 2. 提出两个发展建议 """ chain = prompt | ollama_llm result = chain.invoke({ "region": "长江三角洲", "data_type": "经济密度分布" }) ``` #### 四、常见问题解决方案 1. **中文乱码处理**: - QGIS设置:`设置 → 选项 → 数据源 → 默认编码`选择GB18030[^4] - Python脚本添加编码声明: ```python import sys reload(sys) sys.setdefaultencoding('utf-8') ``` 2. **模型响应异常**: ```python # 增加响应格式约束 structured_llm = ollama_llm.bind( response_format={"type": "json_object"}) ``` 3. **空间数据格式转换**: ```python from qgis.core import QgsGeometry # WKT与GeoJSON互转 geom = QgsGeometry.fromWkt("POINT(121.47 31.23)") geojson = geom.asJson() ``` §§ 相关问题 §§ 1. 如何在QGIS中调用Python实现批量空间数据分析? 2. LangChain如何支持多模态地理数据(栅格/矢量)处理? 3. Ollama本地部署大模型时如何优化GPU资源分配? 4. 使用DeepSeek模型进行地理文本生成时的prompt设计技巧? 5. QGIS插件开发如何整合AI模型接口?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李昊哲小课

桃李不言下自成蹊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值