1、测试ollama的代码
import requests
import json
url_generate = "http://localhost:11435/api/chat"
def get_response(url, data):
response = requests.post(url, json=data)
response_dict = json.loads(response.text)
print("模型回复:",response_dict)
# response_content = response_dict["response"]
# return response_content
data = {
"model": "qwen2.5-coder:7b",
"messages": [
{ "role": "user", "content": "你好" }
],
"stream": False
}
res = get_response(url_generate,data)
print(res)
2、安装好crew用本地ollama提供大模型服务
from langchain_openai import ChatOpenAI
import os
#将ollama的api转化为OPENAI式的api,方便crewai调用
#设置系统环境变量OPENAI_API_BASE和OPENAI_API_KEY
os.environ["OPENAI_API_BASE"] = "http://localhost:11435/v1"
os.environ["OPENAI_API_KEY"] = "NA"
llama_model = ChatOpenAI(model = "qwen2.5-coder:7b")
from crewai_tools import SerperDevTool
search_tool = SerperDevTool()
os.environ["SERPER_API_KEY"] = "C0E999B040F14917AF693921C80D5861"# serper.dev API key
from crewai import Agent
planner = Agent(
role = "内容策划专员",
goal = "策划有关{topic}的引人入胜且事实准确的内容",
backstory = (
"您是一名内容策划专员,正在计划撰写一篇主题为“{topic}”的博客文章, "
"文章将发布在 'https://medium.com/'。"
"您收集的信息可帮助受众了解某些内容,使受众能因此做出明智的决定。"
"您必须准备一份详细的大纲,博客文章中应包含的相关主题和子主题。"
"您的工作是内容创作专员撰写此主题文章的基础。"
"工作语言是中文。"
),
llm = llama_model,
allow_delegation = False,
tools=[search_tool],
verbose = True
)
writer = Agent(
role = "内容创作专员",
goal = "撰写主题{topic}的评论文章,要深刻且事实准确",
backstory = (
"您是一名内容编辑专员,正在撰写一篇主题 “{topic}” 的新观点文章, "
"文章将发表在 'https://medium.com/'。"
"内容策划师提供了有关该主题的大纲和相关背景。"
"您创作内容时,请遵循内容策划师提供的大纲为主要目标和方向。"
"同时您将提供客观公正的见解,并使用内容策划师提供的信息支持您的见解。"
"您在观点文章中承认您的陈述是意见,而不是客观陈述。"
"工作语言是中文。"
),
allow_delegation = False,
llm = llama_model,
verbose = True
)
editor = Agent(
role = "内容编辑专员",
goal = "编辑给定的博客文章,以符合网站 'https://medium.com/' 的写作风格",
backstory = (
"您是一名内容编辑专员,收到内容创作专员发来的博客文章。"
"您的目标是审核博客文章,确保其符合新闻业最佳实践,"
"在发表意见或主张时提供平衡的观点,并尽可能避免重大争议话题或意见。"
"工作语言是中文。"
),
llm = llama_model,
allow_delegation = False,
verbose = True
)
from crewai import Task
plan = Task(
description = (
"1. 优先考虑“{topic}”的最新趋势、关键参与者和值得关注的新闻。\n"
"2. 确定目标受众,考虑他们的兴趣和痛点。\n"
"3. 制定详细的内容大纲,包括简介、要点和行动号召。\n"
"4. 包括 SEO 关键字和相关数据或来源。"
),
expected_output = "一份全面的内容计划文档,其中包含大纲、受众分析、SEO 关键字和参考资源。",
agent = planner,
)
write = Task(
description = (
"1. 使用内容策划专员的内容策划,撰写一篇关于“{topic}”的引人入胜的博客文章。\n"
"2. 自然地融入 SEO 关键词。\n"
"3. 章节/副标题以引人入胜的方式正确命名。\n"
"4. 确保文章结构合理,有引人入胜的介绍、有见地的正文和总结性结论。\n"
"5. 校对语法错误并与品牌调性保持一致。\n"
),
expected_output = "一篇写得很好的、准备发布的 Markdown 格式的博客文章,每个部分应该有 2 或 3 个段落。",
agent = writer,
)
edit = Task(
description = (
"校对给定的博客文章"
"检查其语法错误并与品牌调性保持一致。"
),
expected_output = "一篇写得很好的、准备发布的 Markdown 格式的博客文章,每个部分应该有 2 或 3 个段落。",
agent = editor
)
#组装成CREW
from crewai import Agent, Task, Crew
crew = Crew(
agents = [planner, writer, editor],
tasks = [plan, write, edit],
verbose = 2
)
#撰写一个Topic: "在管理学领域,如何用Python做文本分析" 的文章
inputs = {"topic": "Python文本分析"}
result = crew.kickoff(inputs=inputs)
结果如下: