基于 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_manager
→callbacks
LLMChain
→RunnableSequence
3. 连接错误
检查 Ollama 服务是否启动:
curl http://localhost:11434/api/tags # 应返回模型列表
七、扩展与优化
1. 功能增强
- 添加多轮对话支持
- 集成地图可视化
- 增加酒店/景点评分功能
2. 性能优化
- 添加缓存机制
- 实现异步调用
- 模型量化压缩
3. 界面改进
开发 Web 界面:
pip install flask # 或 streamlit
八、总结
通过本教程,你学会了:
- 本地部署和使用 Ollama 模型
- 使用 LangChain 最新 API 开发应用
- 处理库版本变更带来的兼容性问题
- 基于大模型构建实用工具的基本流程
这个项目可以作为 AI 应用开发的起点,你可以根据需求扩展更多功能!