挑选合适的模型
调用API需要花钱,因此在搭建阶段最佳的方法是利用Ollama部署本地CPU推理的轻量化大模型。大模型选择可以参照hugging face的榜单open-llm-leaderboard。
这里对我来说,要选择的模型需要满足
1.ollama上有的模型。
2.推理速度快(3b左右大小)。
3.对中文支持好(最好是国产大模型,后面部署调用API也便宜、方便)。
综上,选择qwen2.5:3b。
安装好Ollama后,cmd运行该指令便可安装。
ollama run qwen2.5:3b
定义提示模版
提示模板的基本原则是:
1.给予模型清晰明确的指示
2.让模型慢慢地思考
我希望提示词能重点关注文献的领域和年份,因此撰写模板如下:
from langchain.prompts import PromptTemplate
# 创建原始模板
template = """您是一位专业的学者。\n
对于 {theme} 研究领域的{year}以来的进展 ,您能提供富有洞见的综述吗?
"""
# 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template)
用Ollama部署本地模型
参考官方文档配置
封装得很好了。代码如下:
from langchain_ollama.llms import OllamaLLM
model = OllamaLLM(model='qwen2.5:3b')
到这里,就可以进行一个小测试了,可以查看运行结果。
# 测试本地大模型
from langchain.prompts import PromptTemplate
from langchain_ollama.llms import OllamaLLM# 创建原始模板
template = """您是一位专业的学者。\n
对于 {theme} 研究领域的{year}以来的进展 ,您能提供富有洞见的综述吗?
"""
# 根据原始模板创建LangChain提示模板
prompt = PromptTemplate.from_template(template)model = OllamaLLM(model='qwen2.5:3b')chain = prompt | model# 文献检索列表
Theme = ["张量分解","大模型压缩","大模型推理加速"]
Year = ["2020","2021","2021"]for theme, year in zip(Theme, Year):# 使用提示模板生成输入input_prompt = prompt.format(theme=theme, year=year)# 得到模型的输出output = chain.invoke(input_prompt)# 打印输出内容print(output)
输出解析
输出解析可以实现对输出的结果进行有针对性的总结,选取出用户感兴趣的话题。
具体的实现方法是,在输入的提示里加入我感兴趣的话题,并加以定义。
# 定义我们想要接收的响应模式
response_schemas = [ResponseSchema(name="content", description="对于这个领域的{year}以来的现有科研进展和有潜力方向的综述"),ResponseSchema(name="salary", description="分析这个领域2029年毕业博士的月薪水平,以人民币计价")
]
# 创建输出解析器
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
然后加到提示词模版中
format_instructions = output_parser.get_format_instructions()
# 根据原始模板创建提示,同时在提示中加入输出解析器的说明
prompt = PromptTemplate.from_template(prompt_template,partial_variables={"format_instructions": format_instructions})
加完后的模版示例如下:
最后,模型的回答如下
从中取出我想要的关键词即可
output = chain.invoke(input_prompt)# 解析模型的输出(这是一个字典结构)parsed_output = output_parser.parse(output)# 在解析后的输出中添加“theme”和“price”parsed_output['theme'] = themeparsed_output['year'] = year# 将解析后的输出添加到DataFrame中df.loc[len(df)] = parsed_output
整个代码如下:
# 测试本地大模型
from langchain.prompts import PromptTemplate
from langchain_ollama.llms import OllamaLLM
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
import pandas as pd## 创建原始模板
prompt_template = """您是一位专业的学者。
对于 {theme} 研究领域的{year}以来的进展 ,您能提供富有洞见的综述吗?
{format_instructions}"""
# 根据原始模板创建LangChain提示模板
# prompt = PromptTemplate.from_template(template)## 模型
model = OllamaLLM(model='qwen2.5:3b')## 输出格式解析
# 定义我们想要接收的响应模式
response_schemas = [ResponseSchema(name="content", description="对于这个领域的{year}以来的现有科研进展和有潜力方向的综述"),ResponseSchema(name="salary", description="分析这个领域2029年毕业博士的月薪水平,以人民币计价")
]
# 创建输出解析器
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
# 获取格式指示
format_instructions = output_parser.get_format_instructions()
# 根据原始模板创建提示,同时在提示中加入输出解析器的说明
prompt = PromptTemplate.from_template(prompt_template,partial_variables={"format_instructions": format_instructions})chain = prompt | model# 文献检索列表
Theme = ["张量分解","大模型压缩","大模型推理加速"]
Year = ["2020","2021","2021"]# 创建一个空的DataFrame用于存储结果
# df = pd.DataFrame(columns=["theme", "year", "content", "application_value", "scientific_value"]) # 先声明列名
df = pd.DataFrame(columns=["theme", "year", "content","salary"]) # 先声for theme, year in zip(Theme, Year):# 使用提示模板生成输入input_prompt = {"theme": theme, "year": year}# 得到模型的输出output = chain.invoke(input_prompt)# 解析模型的输出(这是一个字典结构)parsed_output = output_parser.parse(output)# 在解析后的输出中添加“theme”和“price”parsed_output['theme'] = themeparsed_output['year'] = year# 将解析后的输出添加到DataFrame中df.loc[len(df)] = parsed_output# 打印字典
print(df.to_dict(orient='records'))# 保存DataFrame到CSV文件
df.to_csv("paper_review.csv", index=False)